본문 바로가기

Algorithms & Design Patterns/Algorithms

Heap Sort in python (힙정렬)

Heap Sort 힙정렬


list를 이용하여 Heap을 구성하였습니다. (힙이란?)

Max Heap 이기 때문에 정렬이 내림차순으로 됩니다.


left: 왼쪽 자식 노드

right: 오른쪽 자식 노드

parent: 부모 노드

max_heapify: max heap의 특성을 유지하도록 노드 순서 변경

build_max_heap: 입력받은 리스트를 heap 특성을 갖는 리스트로 생성

heap_sort: heap sort


버그 및 더 나은 아이디어는 언제든지 환영합니다.

아래의 소스는 https://github.com/JosephDev/python-algorithm 에 공개되어 있으니 소스코드 개선에 참여해주세요. :)



import random

def left(idx=None):
    return ((idx+1)<<1)-1

def right(idx=None):
    return (idx+1)<<1

def parent(idx=None):
    ((idx+1)>>1)-1

def max_heapify(arry=None, idx=None, heap_size=None):
    """
    LEFT: ((idx+1)<<1)-1
    RIGHT: (idx+1)<<1
    PARENT: ((idx+1)>>1)-1
    """
    l = left(idx)
    r = right(idx)
    
    if l <= heap_size and arry[l] > arry[idx]:
        largest = l
    else:
        largest = idx
    if r <= heap_size and arry[r] > arry[largest]:
        largest = r
    if largest != idx:
        arry[idx], arry[largest] = arry[largest], arry[idx]
        max_heapify(arry, largest, heap_size)

def build_max_heap(arry=None):
    heap_size = len(arry)-1
    for i in reversed(xrange(len(arry)//2)):
        max_heapify(arry, i, heap_size)

def heap_sort(heap=None):
    tmp_arry = list()
    for i in xrange(len(heap)):
        tmp_arry.append(heap.pop(0))
        max_heapify(heap, 0, len(heap)-1)
    return tmp_arry

if __name__ == "__main__":
    arry = [16, 4, 10, 14, 7, 9, 3, 2, 8, 1, 12, 5, 3, 8, 2, 10, 33, 44, 7, 2, 8, 5, 4]
    build_max_heap(arry)
    print heap_sort(arry)