# 두 수를 바꾸는 함수
def swap(n1, n2):
temp = n1
n1 = n2
n2 = temp
return n1, n2
lst = [1, 3, 5, 7, 4, 2, 6]
def select_sort(lst):
# 기준 위치 i
for i in range(len(lst)):
# i 뒤에 위치한 숫자들의 위치 j
for j in range(i, len(lst)):
# 기준 숫자가 그 뒤에 숫자들보다 크다면
if lst[i] > lst[j]:
# 스왑 함수 실행
lst[i], lst[j] = swap(lst[i], lst[j])
return lst
lst = [1, 3, 5, 7, 4, 2, 6]
def insertion_sort(lst):
# 기준 위치 i
for i in range(1, len(lst)):
# i부터 0번째 위치까지 역순으로 진행
for j in range(i, 0, -1):
# i번째 숫자가 i-1번째 숫자보다 작다면
if lst[i-1] > lst[i]:
# swap
lst[i-1], lst[i] = lst[i], lst[i-1]
return lst
lst = [1, 3, 5, 7, 4, 2, 6]
def bubble_sort(lst):
# 기준 위치 i
for i in range(len(lst)):
for j in range(len(lst)-1-i):
# j번째가 j+1번째보다 크다면
if lst[j] > lst[j+1]:
# swap
lst[j], lst[j+1] = lst[j+1], lst[j]
return lst
lst = [1, 3, 5, 7, 4, 2, 6]
def merge_sort(lst):
# 더이상 분할을 진행할 수 없을 때
if len(lst) <= 1:
return lst
# 중앙값 설정
mid = len(lst) // 2
# 왼쪽 공간 설정
left = lst[:mid]
# 오른쪽 공간 설정
right = lst[mid:]
# 왼쪽 공간 정렬
left = merge_sort(left)
# 오른쪽 공간 정렬
right = merge_sort(right)
return merge(left, right)
def merge(left, right):
result = []
# 왼쪽 위치
i = 0
# 오른쪽 위치
j = 0
# left 안에 i가 있고, right 안에 j가 있는 동안 반복
while i < len(left) and j < len(right):
# 왼쪽 값이 오른쪽 값보다 작을 때
if left[i] < right[j]:
# 왼쪽값 추가
result.append(left[i])
# 오른쪽으로 한 칸 이동
i += 1
else:
# 오른쪽값 추가
result.append(right[j])
# 오른쪽으로 한 칸 이동
j += 1
# left 안에 i가 있는 동안
while i < len(left):
# 왼쪽값 추가
result.append(left[i])
# 오른쪽으로 한 칸 이동
i += 1
# right 안에 j가 있는 동안
while j < len(right):
# 오른쪽값 추가
result.append(right[j])
# 오른쪽으로 한 칸 이동
j += 1
return result
lst = [1, 3, 5, 7, 4, 2, 6]
def quick_sort(lst):
# 더이상 분할을 진행할 수 없을 때
if len(lst) <= 1:
return lst
# 기준값 설정
pivot = lst[len(lst)//2]
# 왼쪽 공간, 오른쪽 공간, 중앙 공간 생성
left = []
right = []
equal = []
# lst 안의 숫자를 꺼냄
for num in lst:
# 기준값보다 작다면
if num < pivot:
# 왼쪽 공간에 추가
left.append(num)
# 기준값보다 크다면
elif num > pivot:
# 오른쪽 공간에 추가
right.append(num)
# 기준값과 같다면
else:
# 중앙 공간에 추가
equal.append(num)
return quick_sort(left) + equal + quick_sort(right)
insertion sort와 merge sort을 결합하여 만든 정렬이다. 이 알고리즘의 최선의 시간 복잡도는 O(n), 평균 시간 복잡도는 O(n*log(n)), 최악의 경우의 시간 복잡도는 O(n*log(n))이다.
두 안정적인 정렬 알고리즘을 결합하였기에 안정적이며, 기존 merge sort에 비해 추가 메모리 사용이 적어서 다른 O(n*log(n)) 알고리즘의 단점을 극복했다.
insertion sort는 인접한 메모리와의 비교를 반복하기에 참조 지역성의 원리를 매우 잘 만족하고 있다. 작은 n에 대하여 정렬 속도가 빠르다. 이것을 이용하여 전체를 작은 덩어리로 잘라 insertion sort로 정렬한 뒤 병합한다.