每日一題的演算法 2020 09 10堆排序

2021-10-09 08:35:13 字數 1559 閱讀 1824

參考:

主要理解怎麼生成大頂堆!其餘還是很好理解的。當然這個寫大頂堆的方式不一定是最合適的方式。

你能寫出偽**嗎?如果能也算自己理解了

講解:

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