資料結構 排序 堆排序

2021-10-07 16:21:57 字數 1930 閱讀 9157

堆排序是選擇排序中的一種,選擇排序的思想是在未排序的數列中選擇乙個最大或者最小的資料加入已排序序列,大根堆這個結構的根節點就是最大值,因此會大大方便選擇。

--在完全二叉樹中,根》左,右

手動建堆:

第一步:順序建立一棵樹

第二步:檢查非葉子結點是否滿足 根》左,右,不滿足就將當前節點與最大的乙個孩子互換(0位置不儲存),注意調整上層結點的時候有可能破壞下層的堆結構,此時要繼續檢查。不斷下墜,下墜到無法下墜為止。

演算法建堆:

1.從n/2位置開始,逐個非終端節點都要呼叫adjustheap,因為n/2是第乙個非葉子節點的序號,所有的葉子節點都已經滿足堆的定義了,所以所有的葉子節點都不需要調整。

2.if語句中的條件不能隨便安排順序  if(i&a, int k, int n)

} a[k] = a[0];

}//建堆

void bulidmaxheap(vector&a,int n) 建堆的時間複雜度:n,下面用乙個例子說明調整堆的過程:假設已經調整到了最後乙個結點k=1

1.被刪除元素與最後乙個節點交換

2.交換後的最後乙個結點被剔除在大根堆之外,大根堆元素個數-1

3.重新調整以新元素為根節點的二叉樹為堆

注意,一次刪除只需要呼叫一次調整演算法即可

思路:第一步建堆,第二步刪除根節點並輸出最大值,重新調整剩下的結點

時間複雜度:nlog2n

注意:所謂將堆底元素剝離,實際上是在調整新堆的時候將堆的大小減1,實際還是存在在陣列末尾的。

//2.調整堆

void adjustheap(vector&a, int k, int n)

} a[k] = a[0];

}//1.建堆

void bulidmaxheap(vector&a,int n)

//3.主

將待插入的元素放在堆底,不斷的與父節點對比,如果比父節點更小就一路上公升,上公升到無法上公升為止

插入:一路上深,直到無法上公升為止,不會回頭比較

刪除:一路下墜,直到無法下墜為止,不會回頭比較

建堆:左右看,上下看,都要檢查!

最後在這節的末尾補充完全二叉樹的幾個規律,再次強調只有在從1位置儲存的時候才有這些規律

資料結構 排序(堆排序)

最小堆的特性說明 即任何一非葉節點的值不大於其左右孩子節點的值。堆排序最適合取topn的資料 include myheap.h int myswap int src,int desc 調整樹 arr 需要排序的陣列 root 根節點 size 樹的大小 int changetree int arr,...

資料結構 排序 堆排序

附加空間 乙個儲存最大記錄的空間 是否是穩定的排序方法 不穩定 include stdio.h define maxsize 10 typedef int keytype typedef struct recordtype typedef struct table void swap table t...

資料結構排序 堆排序

堆排序就是利用了最大堆 或最小堆 堆頂記錄的關鍵字最大 或最小 這一特徵,使得在當前無序區中選取最大 或最小 關鍵字變得簡單。以最大堆為例,它的基本思想就是 先將初始檔案r 1.n 建成乙個最大堆,此堆為初始的無序區 再將關鍵字最大的記錄r 1 即堆頂 和無序區的最後乙個記錄r n 交換,由此得到新...