資料結構學習筆記 堆排序

2021-07-09 16:32:23 字數 1308 閱讀 1755

堆是一棵完全二叉樹。每個結點的值都大於等於該結點的孩子結點的堆稱為大頂堆,反之則稱為小頂堆。

為了使用簡便,我們就用陣列heap來儲存堆結構,heap[1]儲存堆的根結點,如果當前遍歷的結點為heap[i],則heap[2i]和heap[2i+1]分別為其左右孩子結點。

在了解了堆結構定義之後,我們就可以利用堆結構來進行排序。堆排序的基本思想就是,利用根結點一定是堆中最大或最小的結點,每次取出根結點後調整整個堆,這樣就可以依次取出最大結點、次大結點....直到完成排序任務。

堆排序的主要過程:

調整初始序列為乙個堆(本文選取為大頂堆)作為無序區。

從堆中取出根結點heap[1]與無序區最後乙個結點heap[rear]交換,由此得到無序區heap[1]到heap[rear-1],和有序區heap[rear]。

交換後的無序區可能不符合堆的性質,對無序區進行調整。

重複第2,3步,直到無序區元素全部被取出。

過程圖如下:

實現**如下:

/*對以front為根結點的完全二叉樹進行大頂堆調整

* 末尾結點為rear*/

void heapadjust(int list, int front, int rear)

/*把根結點與其較大的孩子結點進行比較

* 根結點大則說明符合性質,否則將根結

* 點與較大孩子結點進行交換*/

if(temp >= list[i])

else

}/*插入根結點*/

list[f] = temp ;

}/*對長度為num的序列進行堆排序*/

void heapsort(int list, int num)

/*依次取出堆頂*/

for(step = num+1; step > 0; step--)

}

堆排序是選擇排序的一種,它利用陣列可以隨機選取元素的特性快速地建立大頂堆然後依次選取。堆排序的時間開銷主要是初始序列建堆和選取根結點後的反覆建堆過程,其平均時間複雜度為o(n*log n)。

資料結構學習筆記 堆和堆排序

堆,是一種特殊的樹 經典的應用場景,堆排序,原地的時間複雜度為o nlogn 的排序演算法 堆的兩點定義 每個節點的值都大於等於子樹中每個節點值的堆叫做大頂堆,反之叫做小頂堆 之前說過完全二叉樹適合用陣列儲存,所以堆也用陣列儲存 堆的核心操作有插入元素和刪除堆頂元素,以大頂堆為例 插入元素 todo...

資料結構學習之 排序高階(堆排序)

氣泡排序 一種比較容易理解的排序演算法,可以優化的程度也比較有限 平均 o n 2 最壞 o n 2 最好 o n 最好情況需要在進行迴圈之前加入標誌位,若一次遍歷中,沒有任何兩個資料被交換,則認為序列已經有序,跳出迴圈。此時,時間複雜度為o n 插入排序 選擇乙個資料插入到前面已經排好的有序佇列之...

資料結構學習筆記 排序

排序 就是要整理表中的元素,使之按關鍵字遞增 或遞減 有序排列。如果待排序的表中,存在有多個關鍵字相同的元素,經過排序後這些具有相同關鍵字的元素之間的相對 次序保持不變,則稱這種 排序演算法是穩定的。在排序過程中,若整個表都是放在記憶體中處理,排序時不涉及資料的內 外存交換,則稱之為 內排序 反之,...