# 堆排序,利用堆進行排序
# 堆是一種完全二叉樹,分為大根堆、小根堆
# 大根堆:每個父節點大於等於子節點;小根堆:每個父節點小於等於子節點
# 演算法原理(公升序):
# 1.構造大根堆
# 2.將堆頂點與最右下進行交換(最值右移)
# 3.除最右下值(最大值)外,構造大根堆
# 4.重複實現公升序
# 實現過程:
#參考
import random
def max_heapify(heap,heapsize,root): #在堆中做結構調整使得父節點的值大於子節點
left = 2*root + 1
right = left + 1
larger = root
if left < heapsize and heap[larger] < heap[left]:
larger = left
if right < heapsize and heap[larger] < heap[right]:
larger = right
if larger != root: #如果做了堆調整則larger的值等於左節點或者右節點的,這個時候做對調值操作
heap[larger],heap[root] = heap[root],heap[larger]
max_heapify(heap, heapsize, larger)
def build_max_heap(heap): #構造乙個堆,將堆中所有資料重新排序
heapsize = len(heap) #將堆的長度當獨拿出來方便
for i in range((heapsize -2)//2,-1,-1):#從後往前出數
max_heapify(heap,heapsize,i)
def heapsort(heap):
build_max_heap(heap)
for i in range(len(heap)-1,-1,-1): #將根節點取出與最後一位做對調,對前面len-1個節點繼續進行對調整過程。
heap[0],heap[i] = heap[i],heap[0]
max_heapify(heap, i, 0)
return heap
if __name__ == '__main__':
range = 100
length = 11
list = random.sample(range(range), length) # 在指定序列中隨機獲取指定長度片段
print('before sort:', list)
heapsort(list)
print('after sort:', list)
演算法 堆排序(堆)
使用情形 插入乙個數 求集合當中的最小值 刪除最小值 刪除任意乙個元素 修改任意乙個元素 用一維陣列儲存二叉樹,左兒子在陣列中為根節點在陣列中的位置的2倍,右兒子在陣列中為根節點在陣列中的位置的二倍加一。求當前堆的最小值 void down int u 輸入乙個長度為n的整數數列,從小到大輸出前m小...
python3堆排序 python 堆排序
堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點 但是不保證所有左子樹比右子樹小反之亦然 堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個...
排序演算法(六) 堆排序
堆定義 堆是一種完全二叉樹,每個結點都大於等於其子結點的稱為大頂堆,每個結點都小於等於其子結點的稱為小頂堆。堆排序定義 將待排序的序列構造成乙個大頂堆,此時堆頂是最大值,將其移到序列最末端後,剩餘的序列重新構造乙個大頂堆,如此反覆直到得到乙個有序序列。時間複雜度 o nlogn 實現 public ...