堆排序之堆的概念 插入 刪除 建堆

2021-08-10 13:21:52 字數 1765 閱讀 8451

內容會持續更新,有錯誤的地方歡迎指正,謝謝!

性質:完全二叉樹 或 近似完全二叉樹(不是滿二叉樹的完全二叉樹)。

分類:最大堆:父節點的值不小於子節點;最小堆:父節點的值不大於子節點。

左右子節點:沒有大小的順序。

堆的儲存:

一般都用陣列來儲存堆。下標為i的節點的父節點的下標為(i–1)/2。根節點的左右子節點下標分別為 2∗i+1 和 2∗i+2。例如:下標為0的節點左右子節點的下標分別為1和2。

堆的操作:插入、刪除、建堆。

最小堆的圖:

原理:新元素必須插入到二叉樹的末尾(即堆尾)。如果該陣列構成的二叉樹不滿足堆的性質,則需要重新排列元素—「上浮」操作。

最小堆的插入操作圖:

最大堆的插入操作的**:

//非常建議各位看官根據對原理的理解,寫出自己的**,切忌看我的**去理解演算法,否則很快就會忘記!

void maxheapfixup(int* array, int

index)

else

break;

index = indexfather;

indexfather = (index - 1) / 2;}}

原理:刪除操作必須刪除該二叉樹的根節點(即堆頂)。堆中最後乙個元素用來補空,再重新排列元素—「下沉」操作。

最小堆的刪除操作圖:

刪除操作的**:

//非常建議各位看官根據對原理的理解,寫出自己的**,切忌看我的**去理解演算法,否則很快就會忘記!

void maxheapfixdown(int* array, int length, int index)

array[index] = temp;

}

最小堆的初始圖:

原理:很明顯,對葉子結點來說,可以認為它已經是乙個合法的堆了,即 20,60, 65,4, 49 都分別是乙個合法的堆。只要從 a[4]=50 開始向下進行堆調整就可以了。然後再對 a[3]=30,a[2] = 17,a[1] = 12,a[0] = 9 分別作一次向下堆調整就可以了。

下面展示了建最小堆的步驟:

建最大堆的**:

void makemaxheap(int* array, int

length)

}

請檢視我的另一篇部落格,裡面有詳細地介紹:樹形選擇排序—堆排序

面試前必看 堆排序 堆插入 堆刪除

目錄 1.對乙個數組建最大堆,得到堆頂最大值 2.對乙個數組建最大堆,得到排好序 從小到大 的陣列 3.向乙個堆中插入元素 以最小堆作圖示 下面 是對最大堆的操作 4.刪除最大堆的堆頂 以最小堆作圖示 下面 是對最大堆的操作 def sink self,nums,root if 2 root 1 l...

建堆以及堆排序 C

1 建立最小堆,從小到大排序 時間複雜度為o nlogn include int h 100 int n void swap int x,int y 向下調整成最小堆 void siftdown int i int deletemin int main 2 建立最大堆,從小到大排序,最大元素在h 1...

堆的概念及堆排序

堆 heap 是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵完全二叉樹的陣列物件即堆是一種特殊的二叉樹。我們所討論的堆一般特指為二叉堆,二叉堆是完全二叉樹或者是近似完全二叉樹。如下圖所示 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹...