algorithm/theory

힙 정렬.

qkqhxla1 2016. 6. 13. 18:00

정렬 방법론.

1. heapify()함수를 호출해서 힙으로 만든다.

힙 구조로 만드는 과정.

ex)

6 2 8 1 3 9 4 5 10 7 이라는 리스트가 있다고 하자. 이걸 이진 트리로 나타내면.

가 되고 이걸 top down히프로 변환하자. 변환방법은

맨위의 6 2 8 을 보면 가장 큰 수인 8이 맨 위에 있지 않다. 그러므로 6과 8을 교환한다. (부모가 자식 둘보다 커야 한다.) 그다음에는 2 1 3부분의 3과 2를 교환하고, 이런식으로 하나씩 간다. 그러면


이런식으로 된다.



특징.

1. 우선순의 큐의 일종인 힙을 사용한다.

2. 제자리 정렬 알고리즘.

3. 퀵정렬보다 오래걸림.


시간복잡도 : O(NlogN)

# -*- encoding: cp949 -*-
import time
import random
  
N = 10000

def swap(a,i,j):
    a[i],a[j] = a[j],a[i]
  
def CheckSort(a,n):
    Sorted = True
    for i in range(n):
        if a[i] > a[i+1]:
            Sorted = False
        if not Sorted:
            break
    if Sorted: print '정렬 완료.'
    else: print '정렬 오류 발생.'

def heapify(a,h,m):
    v = a[h]
    j = 2*h
    while j <= m:
        if j < m and a[j] < a[j+1]:
            j += 1
        if v >= a[j]: break
        else: a[j/2] = a[j]
        j *= 2
    a[j/2] = v

def HeapSort(a,n):
    for i in range(n/2,0,-1):
        heapify(a,i,n)
    for i in range(n-1,0,-1):
        swap(a,1,i+1)
        heapify(a,1,i)

def main():
    a = [random.randint(1,65536) for i in range(0,N+1)] #랜덤한 10000개의 데이터
    a[0] = -1
    start_time = time.time()
    HeapSort(a,N)
    print '(랜덤)힙 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)
  
    a = [i for i in range(0,N+1)] #정렬된 10000개의 데이터 #리커전이 너무 많이 일어나서 랜덤한 데이터밖에 정렬이 안된다.
    a[0] = -1
    start_time = time.time()
    HeapSort(a,N)
    print '(최고)힙 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)
 
    a = [i for i in range(N,-1,-1)] #최악의 경우의 10000개의 데이터
    a[0] = -1
    start_time = time.time()
    HeapSort(a,N)
    print '(최악)힙 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)
if __name__=='__main__':
    main()

나중에 참고하면 좋을것 같음.


http://ehclub.tistory.com/1256

http://blog.naver.com/hachn/103871306

'algorithm > theory' 카테고리의 다른 글

기수 정렬.  (0) 2016.06.14
계수 정렬.  (0) 2016.06.14
합병 정렬.  (0) 2016.06.13
퀵 정렬.  (0) 2016.06.12
쉘 정렬.  (0) 2016.06.11