1. 程式人生 > >堆排序(python實現)

堆排序(python實現)

對於堆的概念以及它的一些基本操作,請參見我的上一篇部落格

利用堆實現排序的簡單思路是,利用堆頂元素總是最大或者最小的性質,每次彈出一個元素,直到堆空,則彈出元素形成的序列是有序的。但是為了節約儲存空間,我們直接將彈出的元素放在原堆記憶體的後面,這樣形成的最後形成的有序陣列的順序是和堆中資料的順序性是相反的(若是小根堆,排序後是由大到小的;若是大根堆,排序後是由小到大的)。程式碼如下所示

def heap_sort(elems):
    def siftdown(elems,e,begin,end):
        i,j=begin,begin*2+1
        while j<end:
            if j+1<end and elems[j+1]<elems[j]:
                j+=1
            if e<elems[j]:
                break
            elems[i]=elems[j]
            i=j
            j=2*j+1
        elems[i]=e

    end=len(elems)
    for i in range(end//2-1,-1,-1):
        siftdown(elems,elems[i],i,end) #建立堆
    for i in range((end-1),0,-1):
        e=elems[i]
        elems[i]=elems[0]
        siftdown(elems,e,0,i)

以上程式碼是基於小根堆的排序,其中siftdown函式也在我的上一篇部落格中有講解,是元素下沉的操作。該函式首先從傳入的list建立堆。然後依次取下堆頂的元素,放在堆序列中i的位置,i是從堆序列最後位置索引到1依次減小的,每次下沉的範圍下限逐漸減小。

測試程式碼:

elems=[2,5,6,2,5,6,7,3,2,3,6]
heap_sort(elems)
print(elems)#[7, 6, 6, 6, 5, 5, 3, 3, 2, 2, 2]