堆排序:大根堆要求每個節點的值都小於等於父節點的值,小根堆要求每個節點的值大於等於父節點的值
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實現演算法:
#將資料插入到已經建好的堆中
defheap_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)
#大根堆中乙個數變小後,往下沉
defheapify(data, index, length):
left = index * 2 + 1
while left 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
defheapsort(data):
size =len(data)
ifnot 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
#產生隨機列表
defrandom_data():
import
random
res =
for i in range(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)
ifnot
compare(src, des):
print(src)
posted @
2019-04-04 09:24
imlifelong 閱讀(
...)
編輯收藏
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...
排序演算法 堆排序
由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...