堆排序:大根堆要求每個節點的值都小於等於父節點的值,小根堆要求每個節點的值大於等於父節點的值 1、父節點 list[i] 左節點 list[2i+1] 右節點 list[2i+2] 2、大根堆 list[i] >= list[2i+1] && list[i] >= list[2i+2] 3、小根堆 ...
堆排序:大根堆要求每個節點的值都小於等於父節點的值,小根堆要求每個節點的值大於等於父節點的值
1、父節點 list[i] 左節點 list[2i+1] 右節點 list[2i+2]
2、大根堆 list[i] >= list[2i+1] && list[i] >= list[2i+2]
3、小根堆 list[i] <= list[2i+1] && list[i] <= list[2i+2]
在堆的數據結構中,堆中的最大值總是位於根節點(在優先隊列中使用堆的話堆中的最小值位於根節點)。堆中定義以下幾種操作:
1、最大堆調整(Max Heapify):將堆的末端子節點作調整,使得子節點永遠小於父節點
2、創建最大堆(Build Max Heap):將堆中的所有數據重新排序
3、堆排序(HeapSort):移除位在第一個數據的根節點,並做最大堆調整的遞歸運算
python實現演算法:
# 將數據插入到已經建好的堆中 def heap_insert(data, index): # 如果當前數據比他的父節點大,則交換,再繼續往上,與他的父節點比較 root = int((index - 1) / 2) while data[index] > data[root]: data[index], data[root] = data[root], data[index] index = root root = int((index - 1) / 2) # 大根堆中一個數變小後,往下沉 def heapify(data, index, length): left = index * 2 + 1 while left < length: right = left + 1 # 比較當前節點的左右子節點,找到最大的那個下標 larger = right if (right < length and data[right] > data[left]) else left # 比較當前節點和子節點中最大的那個,找到大的那個的下標 larger = larger if data[larger] > data[index] else index # 如果當前節點和最大的那個節點數相同,則不需要做任何操作 if larger == index: break # 當前節點和左右節點的最大的那個交換 data[larger], data[index] = data[index], data[larger] # 當前節點指向最大那個節點,再繼續判斷 index = larger left = index * 2 + 1 def heapsort(data): size = len(data) if not data or size < 2: return data # 創建大根堆 for i in range(size): heap_insert(data, i) size -= 1 # 然後再調整堆為大根堆 while size > 0: data[0], data[size] = data[size], data[0] heapify(data, 0, size) size -= 1 return data #產生隨機列表 def random_data(): import random res = [] for i in range(random.randint(1, 100)): res.append(random.randint(1, 100)) return res #對數器 def compare(src, res): data = sorted(src) if len(data) == len(src): for i in range(len(data)): if data[i] != res[i]: return False return True if __name__ == '__main__': for i in range(100000): src = random_data() des = heapsort(src) if not compare(src, des): print(src)