排序是演算法學習中最基礎的內容,也有很多中排序演算法,這裡簡單介紹學一下堆排序。
理解堆排序之前,一定要先明白什麼是堆,其實它就是乙個陣列或者是陣列的一部分,一定要記住明白這一點,不然容易有一種樹結構的錯覺。它就是在陣列的元素間定義一些關係,讓這些元素看起來近似乙個二叉樹。這些元素組成的陣列就叫做堆。
堆排序的具體流程:
1,使a.heap-size = a.length,把陣列a 轉換為最大堆build-max-heap(a)
2,把a[1]跟a[a.heap-size]交換
3,使a.heap-size減一,對陣列a[1..a.heap-szie]中堆的根節點a[1]進行維護最大堆操作max-heapify,因為a[a.heap-size]是最後乙個節點,是乙個葉節點,所以去掉後,陣列a[1..a.heap-szie]仍然乙個堆。
4,重複上述2,3步驟重複直到a.heap-size等於1,這時陣列a也就排好序了
偽**:
heap-sort(a)
heap-size = a.length
build-max-heap(a)
while heap-size > 1
exchange a[1] with a[heap-size]
heap-size -= 1
max_heapify(a[1..a.heap-szie],1)
max_heapify(a,i)
a.heap-size = a.length
l = left(i)
r = right(i)
if l ≤ a.heap-szie and
a[l] > a[i]
l = largest
elif r ≤ a.heap-szie and
a[r] > a[i]
r = largest
else
i = largest
if largest != i
exchange a[i] with a[largest]
max_heapify(a,largest)
build-max-heap(a)
a.heap-szie = a.length
for i=a.heap-szie/2 downto i
max_heapify(a,i)
排序演算法學習(4)
1.對下列關鍵字序列用快排進行排序時,速度最快的情形是 a a b cd 分析 pivotkey 的選擇越靠近 即左右兩個子串行長度越接近,排序速度越快。21正好是序列的正中,所以排除b,d。a經過一次排序後結果為9,17,5,21 25,23,30 c經過一次排序後結果為5,9,17,21 25,...
強化演算法學習記錄 4
q learning一步步更新q表,收斂速度慢,就是在當前狀態下探測後序狀態對當前狀態的影響,若可以得到n步狀態的評估,可以加速當前狀態的收斂。修改q s,a 表的更新公式,從公式中可以看出來由原來的學習一步變成要學習n步,這n步才使用貪婪策略來 未來n步每一步狀態的行為進行學習,這樣可以探索更遠距...
演算法學習 Union Find演算法
union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...