參考:
主要理解怎麼生成大頂堆!其餘還是很好理解的。當然這個寫大頂堆的方式不一定是最合適的方式。
你能寫出偽**嗎?如果能也算自己理解了
講解:
import timeit
from collections import deque
# 將最大值調到最後
def swap_param(ilist,i,j):
ilist[i], ilist[j] = ilist[j], ilist[i]
return ilist
# 調整二叉樹
def heap_adjust(ilist, start, end):
# 開始的序列號
temp = ilist[start]
i = start
j = 2 * i
while j <= end:
if(j < end) and (ilist[j] < ilist[j+1]):
j += 1
if temp < ilist[j]:
ilist[i] = ilist[j]
i = j
j = 2 * i
else:
break
ilist[i] = temp
# 按推排序
def heapsort(l):
l_length = len(l) - 1
# 構造乙個堆,將堆中所有資料重新排序
first_sort_count = int(l_length / 2)
for i in range(first_sort_count):
heap_adjust(l, first_sort_count - i, l_length)
# 按對排序
for i in range(l_length - 1):
l = swap_param(l, 1, l_length - i) # 將最大值調到最後
heap_adjust(l, 1, l_length - i - 1) # size遞減,保證最大值不會被重新排序
return [l[i] for i in range(1, len(l))]
if __name__ == "__main__":
l = deque([50, 16, 30, 10, 60, 90, 2, 80, 70])
l = list(l) # 轉成列表才能進行列表的操作
print(heapsort(l))
print(timeit.timeit("heapsort(ilist)", "from __main__ import heapsort,ilist", number=100))
結果:
[2, 10, 16, 30, 50, 60, 70, 80, 90]
0.0007214
演算法每日一題 07 31
魔術索引。在陣列a 0 n 1 中,有所謂的魔術索引,滿足條件a i i。給定乙個有序整數陣列,編寫一種方法找出魔術索引,若有的話,在陣列a中找出乙個魔術索引,如果沒有,則返回 1。若有多個魔術索引,返回索引值最小的乙個。示例1 輸入 nums 0,2,3,4,5 輸出 0 說明 0下標的元素為0 ...
演算法每日一題 08 03
給定兩個字串形式的非負整數 num1 和num2 計算它們的和。注意 num1 和num2 的長度都小於 5100.num1 和num2 都只包含數字 0 9.num1 和num2 都不包含任何前導零。你不能使用任何內建 biginteger 庫,也不能直接將輸入的字串轉換為整數形式。class s...
演算法每日一題 08 08
題目 include using namespace std define maxn 200010 int ton maxn in maxn 存拓撲序和入度 struct node int n,m queue int q vectorask 存無向邊 vectorans 存結果 vector int...