大話演算法 排序 堆排序

2021-09-16 20:05:40 字數 2345 閱讀 4326

堆排序:大根堆要求每個節點的值都小於等於父節點的值,小根堆要求每個節點的值大於等於父節點的值

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...