arr =
[2,5,4,2,1,22,4,5,3,87,3,22]
def adjustheap(arr,length,i): # 調整新新增arr[i]元素後,繼續調整為大根堆
temp = arr[i]
# 將arr[i]存入temp
k = 2*i + 1 # 從孩子中進行搜尋
while k < length:
if k+1 < length and arr[k+1]
> arr[k]: # 將k指向孩子中較大的結點
k += 1
if arr[k]
> temp: # 孩子結點中最大的元素比arr[i]大的話,將孩子結點向上拋
arr[i]
= arr[k]
i = k
else: # 孩子結點最大的元素比arr[i]小,則為大根堆,不必調整
break
k = 2*k + 1 # 繼續向下搜尋
arr[i]
= temp
def sort_arr(arr):
n = len(arr)
for i in range(int(n/2)-1,-1,-1): # 從下至上依次遍歷所以葉子結點,最終調整為大根堆
adjustheap(arr,n,i)
for j in range(n-1,0,-1): # 從後至前依次將陣列元素arr[k]與arr[0]進行交換,並將[0,k-1]調整為大根堆
arr[0],arr[j]
= arr[j],arr[0]
adjustheap(arr,j,0)
return arr
sort_arr(arr)
執行結果:
[1, 2, 2, 3, 3, 4, 4, 5, 5, 22, 22, 87]
小黑演算法成長日記3 矩陣最優乘法順序
p 30 35,15 5,10 20,25 def function p n len p 1 m 0 n 1 for i in range n 1 動態規劃最優乘法次數記錄表 s 0 n 1 for i in range n 1 矩陣劃分位置記錄表 for r in range 1 n 對角線垂直方...
小黑演算法成長日記1 遞迴選擇排序,全排列,二分查詢
1.遞迴選擇排序 遞迴選擇排序 defselectsort arr,i if i len arr 1 遞迴出口 return else 子問題處理 min arr i temp i for j in range i 1 len arr if arr j min 計算子問題最小值 min arr j ...
小黑演算法成長日記5 最大段和問題及其推廣
1.簡單暴力窮舉法 窮舉法 defmaxsum arr n len arr max 0 besti 1 bestj 1 for i in range n 遍歷序列開頭指標 sum 0for j in range i,n 遍歷序列結尾指標 sum arr j ifsum max max sum bes...