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萬數據
運行結果如下:
由於堆排序的時間複雜度爲O(NlogN),好像運行的效率確實也印證了這一點。但是其實還可以升入下去了解下,推薦知乎上的一個問題(關於堆排序和快速排序的差異的討論)https://www.zhihu.com/question/23873747,自己也是看了這個才知道,堆排序和cache這個高速緩衝存儲器有關,但這涉及到計算機組成原理的知識(有點忘了)。
另外,上述代碼中是用python中的list這麼個數據結構實現Hsort的,但是有個問題就是相對於dict和set這樣的內置數據結構,list的處理效率就滿了很多,但是仔細一想堆排序的時間消耗主要是在子節點和父節點數據的比較上,所以在這一點上我覺得list這麼個數據結構並不會太多的影響該算法的效率。