堆排序學習筆記——外婆的澎湖灣
前提:堆用完全二叉樹表示時,其表示方法不唯一,但可以確定的是樹的根結點要麼是無序表中的最小值,要麼是最大值。
思想:**步驟:
二叉堆在實現的時候,是採取陣列的形式來儲存的。**實現操作有難度,可以先模仿再屢思路,在**中學習,此處重點學習在下沉操作:從二叉堆中刪除乙個元素,為了充分利用空間,其實我們是可以把刪除的元素直接存放在二叉堆的最後乙個元素那裡的。例如:
刪除堆頂,把刪除的元素放在最後乙個元素。
繼續,把刪除的元素放在最後第二個位置
繼續刪除
以此類推….
這樣,對於乙個含有n個元素的二叉堆,經過n-1(不用刪除n次)次刪除之後,這個陣列就是乙個有序陣列了。
所以,給定乙個無序的陣列,我們需要把這個陣列構建成二叉堆,然後在通過堆頂逐個刪除的方式來實現堆排序。
其實,也不算是刪除了,相當於是把堆頂的元素與堆尾部在交換位置,然後在通過下沉的方式,把二叉樹恢復成二叉堆。
//不妨就想象成一行陣列吧!將parent->low,lenght->high
//並且這裡的陣列第乙個元素下標姑且認為1,否則完全二叉樹不好表示
int downadjust(int a,int low,int high)
//排序
for(i=n;i>=2;i--)
return a;
}
附個小視屏: 純手擼 折半插入排序
折半插入排序需要注意的是 include 後面為了測試寫的輸出,輸出每一次排序後的資訊。void print int a,int n int i else 插入位置後的元素統一後移 for j i j low j a low tmp 插入元素 print a,8,i 測試 int main 預計 1...
純手擼乙個rnn
原文 import copy,numpy as np np.random.seed 0 sigmoid函式 def sigmoid x output 1 1 np.exp x return output sigmoid導數 def sigmoid output to derivative outpu...
演算法 手撕堆排序
時間複雜度 o n logn o nlogn o nlog n 但是實際軟開中,快排效能更好。堆性質 堆排序 從小到大,利用最大堆和陣列 從後往前堆化陣列元素,此時最大元素在首位置 交換元素堆化 include include using namespace std void heapsort in...