python 利用list實現HeapSort(小頂堆)

class minHeap(object):

    def __init__(self,list):
        self.list = list
        self.length = len(list)

    def shiftdown(self, index):
        flag=False
        while index*2 < self.length and flag==False:
            #首先處理左子樹
            if self.list[index] > self.list[index*2]:
                t = index*2
            else:
                t = index
            #再看看是否存在右子樹
            if index*2+1 < self.length:
                if self.list[t] > self.list[index*2+1]:
                    t = index*2+1
            if t!=index:
                self.swap(index,t)
                index=t
            else:
                flag=1

    def swap(self,child_index,parent_index):
        temp = self.list[child_index]
        self.list[child_index] = self.list[parent_index]
        self.list[parent_index] = temp

    def built_heap(self):
        index = int(len(self.list)/2)
        while index>0:
            self.shiftdown(index) 
            index-=1

        if self.list[1] < self.list[0]:
            self.swap(1,0)

        print('[InFo]當前MinValue爲:'+str(self.list[0]))

由於上浮法實現的性質無法對0節點做處理,我們這裏所採取的做法是從1(list下標)開始,0最後處理。

再來測試下運行時間效率和數據量之前的關係:

if __name__=='__main__':
    list1 = [random.randint(0, 1000) for i in range(100)]
    list2 = [random.randint(0, 1000) for i in range(1000)]
    list3 = [random.randint(0, 1000) for i in range(10000)]
    list4 = [random.randint(0, 1000) for i in range(100000)]
    list5 = [random.randint(0, 1000) for i in range(1000000)]
    list6 = [random.randint(0, 1000) for i in range(10000000)]
    start = time.time()
    heap = minHeap(list1).built_heap()
    print('[InFo]100條數據找出最小值耗時:'+str(time.time()-start)+' s')
    start = time.time()
    heap2 = minHeap(list2).built_heap()
    print('[InFo]1000條數據找出最小值耗時:' + str(time.time() - start) + ' s')
    start = time.time()
    heap3 = minHeap(list3).built_heap()
    print('[InFo]10000條數據找出最小值耗時:' + str(time.time() - start) + ' s')
    start = time.time()
    heap4 = minHeap(list4).built_heap()
    print('[InFo]100000條數據找出最小值耗時:' + str(time.time() - start) + ' s')
    start = time.time()
    heap5 = minHeap(list5).built_heap()
    print('[InFo]1000000條數據找出最小值耗時:' + str(time.time() - start) + ' s')
    start = time.time()
    heap6 = minHeap(list6).built_heap()
    print('[InFo]10000000條數據找出最小值耗時:' + str(time.time() - start) + ' s')

數據量範圍是 100 -1000萬數據

運行結果如下:

zj19941201

由於堆排序的時間複雜度爲O(NlogN),好像運行的效率確實也印證了這一點。但是其實還可以升入下去了解下,推薦知乎上的一個問題(關於堆排序和快速排序的差異的討論)https://www.zhihu.com/question/23873747,自己也是看了這個才知道,堆排序和cache這個高速緩衝存儲器有關,但這涉及到計算機組成原理的知識(有點忘了)。

另外,上述代碼中是用python中的list這麼個數據結構實現Hsort的,但是有個問題就是相對於dict和set這樣的內置數據結構,list的處理效率就滿了很多,但是仔細一想堆排序的時間消耗主要是在子節點和父節點數據的比較上,所以在這一點上我覺得list這麼個數據結構並不會太多的影響該算法的效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章