정렬
정렬이란 데이터를 특정한 기준에 따라 순서대로 나열한 것이다.
일반적으로 문제 상황에 따라서 적절한 정렬 알고리즘이 공식처럼 사용된다.
선택 정렬
처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복
- 처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 가장 앞의 데이터와 바꾼다.
- 앞선 1번의 과정을 반복한다.
- 정렬되지 않은 데이터가 하나가 남은 경우 처리하지 않아도 완성이 된다.
array = [7, 3, 5, 4, 2, 6, 1, 0]
for i in range(len(array)):
min_index = i
for j in range(i+1, len(array)):
if array[min_index] > array[j]:
min_index = j
array[i], array[min_index] = array[min_index], array[i] # 스왑
print(array)
선택 정렬의 시간 복잡도
선택 정렬은 N번만큼 가장 작은 수를 찾아서 맨 앞으로 보내야 한다.
구현 방식에 따라서 사소한 오차는 있을 수 있지만, 전체 연산 횟수는 아래와 같다.
N+(N-1)+(N-2)+...+2
이는 빅오 표기법에 따라서 O(N**2)이라고 작성한다.
삽입 정렬
처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입한다.
선택 정렬에 비해 구현 난이도가 높은 편이지만, 일반적으로 더 효율적으로 동작한다.
- 앞쪽의 원소는 이미 정렬되어 있다고 가정하고 다음 데이터가 어디 위치로 들어갈지 판단한다.
- 다음 데이터를 왼쪽 데이터와 비교하여 위치를 판단한다. (현재 위치가 자기 위치일 때까지 왼쪽 데이터와 비교)
array = [7, 3, 5, 4, 2, 6, 1, 0]
for i in range(1, len(array)):
for j in range(i, 0, -1):
if array[j] < array[j-1]:
array[j], array[j-1] = array[j-1], array[j]
else:
break
print(array)
삽입 정렬의 시간 복잡도
삽입 정렬의 시간 복잡도는 O(N**2)이며, 선택 정렬과 마찬가지로 반복문이 두 번 중첩되어 사용된다.
삽입 정렬은 현재 리스트의 데이터가 거의 정렬되어 있는 상태라면 매우 빠르게 동작한다.
- 최선의 경우 O(N)만큼의 시간 복잡도를 가진다.
Reference
정렬
정렬이란 데이터를 특정한 기준에 따라 순서대로 나열한 것이다.
일반적으로 문제 상황에 따라서 적절한 정렬 알고리즘이 공식처럼 사용된다.
선택 정렬
처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복
- 처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 가장 앞의 데이터와 바꾼다.
- 앞선 1번의 과정을 반복한다.
- 정렬되지 않은 데이터가 하나가 남은 경우 처리하지 않아도 완성이 된다.
array = [7, 3, 5, 4, 2, 6, 1, 0]
for i in range(len(array)):
min_index = i
for j in range(i+1, len(array)):
if array[min_index] > array[j]:
min_index = j
array[i], array[min_index] = array[min_index], array[i] # 스왑
print(array)
선택 정렬의 시간 복잡도
선택 정렬은 N번만큼 가장 작은 수를 찾아서 맨 앞으로 보내야 한다.
구현 방식에 따라서 사소한 오차는 있을 수 있지만, 전체 연산 횟수는 아래와 같다.
N+(N-1)+(N-2)+...+2
이는 빅오 표기법에 따라서 O(N**2)이라고 작성한다.
삽입 정렬
처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입한다.
선택 정렬에 비해 구현 난이도가 높은 편이지만, 일반적으로 더 효율적으로 동작한다.
- 앞쪽의 원소는 이미 정렬되어 있다고 가정하고 다음 데이터가 어디 위치로 들어갈지 판단한다.
- 다음 데이터를 왼쪽 데이터와 비교하여 위치를 판단한다. (현재 위치가 자기 위치일 때까지 왼쪽 데이터와 비교)
array = [7, 3, 5, 4, 2, 6, 1, 0]
for i in range(1, len(array)):
for j in range(i, 0, -1):
if array[j] < array[j-1]:
array[j], array[j-1] = array[j-1], array[j]
else:
break
print(array)
삽입 정렬의 시간 복잡도
삽입 정렬의 시간 복잡도는 O(N**2)이며, 선택 정렬과 마찬가지로 반복문이 두 번 중첩되어 사용된다.
삽입 정렬은 현재 리스트의 데이터가 거의 정렬되어 있는 상태라면 매우 빠르게 동작한다.
- 최선의 경우 O(N)만큼의 시간 복잡도를 가진다.
Reference