정렬 알고리즘은 동일한 순위의 데이터들이 정렬 후에도 순서가 보장되는 안정된(stable) 알고리즘과 그렇지 않은 알고리즘 두가지가 있다

내부 정렬과 외부 정렬

정렬은 메모리에서 수행한다. 하지만 너무 큰 데이터가 들어와 메모리 내에 전부 적재할 수 없으면 어떻게 될까? 이럴 땐 데이터를 쪼개 여러개로 나누고 외부에서 정렬 후 합치는 과정을 거쳐야 한다. 이를 외부 정렬이라 하고 여기에서도 여러 알고리즘이 있다

버블 정렬

개선 1

def bubble_sort_enhance(lst: list):
    length = len(lst)
    for i in range(length - 1):
        print(lst)
        exch = 0
        for j in range(i, length):
            if lst[i] > lst[j]:
                lst[i], lst[j] = lst[j], lst[i]
                exch += 1
        if exch == 0:
            break

개선 2

def bubble_sort_enhance_2(lst: list):
    n = len(lst)
    k = 0
    while k < n - 1:
        last = n - 1
        print(lst)
        for j in range(n - 1, k, -1):
            if lst[j - 1] > lst[j]:
                lst[j - 1], lst[j] = lst[j], lst[j - 1]
                last = j
        k = last

개선 3 (쉐이커 정렬)

def shaker_sort(lst: list):
    left = 0
    right = len(lst) - 1
    last = right
    while left < right:
        print(lst)
        for i in range(right, left, -1):
            if lst[i] < lst[i-1]:
                lst[i], lst[i-1] = lst[i-1], lst[i],
                last = i
            left = last
            
        for j in range(left, right):
            if lst[j] > lst[j+1]:
                lst[j], lst[j+1] = lst[j+1], lst[j],
                last = j
            right = last

선택 정렬

리스트 내의 원소에서 가장 작은 원소를 선택해 맨 앞으로 보내는 정렬, 안정적이지 않다