堆排序的基本概念和基本思路
一 堆排序基本介紹
1 堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序, 它的最壞、最好、平均時間復雜度均為 O(nlogn), 它也是不穩定排序。
2 堆是具有以下性質的完全二叉樹:每個結點的值都大于或等于其左右孩子結點的值,?這種情況稱為大頂堆,注意:沒有要求結點的左孩子的值和右孩子的值的大小關系。
3 每個結點的值都小于或等于其左右孩子結點的值,?這種情況稱為小頂堆。
4 大頂堆舉例說明
5 小頂堆舉例說明
6 一般升序采用大頂堆, 降序采用小頂堆。
二 堆排序基本思想
1 將待排序序列構造成一個大頂堆。
2 此時,整個序列的最大值就是堆頂的根節點。
3 將其與末尾元素進行交換, 此時末尾就為最大值。
4 然后將剩余 n-1 個元素重新構造成一個堆, 這樣會得到 n 個元素的次小值。 如此反復執行, 便能得到一個有序序列了。
可以看到在構建大頂堆的過程中, 元素的個數逐漸減少,最后就得到一個有序序列了。
三 堆排序步驟圖解
1 要求
數組 {4,6,8,5,9} , 要求使用堆排序法, 將數組升序排序。
2?算法
步驟一 構造初始堆。
將給定無序序列構造成一個大頂堆。(一般升序采用大頂堆,降序采用小頂堆)。
原始的數組 [4, 6, 8, 5, 9]
a 假設給定無序序列結構如下。
b 此時我們從最后一個非葉子結點開始(arr.length/2-1=5/2-1=1,也就是下面的 6 結點),從左至右,從下至上進行調整。
c 找到第二個非葉節點 4,由于[4,9,8]中 9 元素最大,4 和 9 交換。
d 這時,交換導致了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中 6 最大,交換 4 和 6。
此時,我們就將一個無序序列構造成了一個大頂堆。
步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大。然后繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反復進行交換、重建、交換。
a 將堆頂元素 9 和末尾元素 4 進行交換。
b 重新調整結構,使其繼續滿足堆定義。
c 再將堆頂元素 8 與末尾元素 5 進行交換,得到第二大元素 8。
d 后續過程,繼續進行調整,交換,如此反復進行,最終使得整個序列有序。
四?總結
1 將無序序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆。
2 將堆頂元素與末尾元素交換,將最大元素"沉"到數組末端。
3 重新調整結構,使其滿足堆定義,然后繼續交換堆頂元素與當前末尾元素,反復執行調整+交換步驟,直到整個序列有序。
總結
以上是生活随笔為你收集整理的堆排序的基本概念和基本思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mask R-CNN学习笔记
- 下一篇: 浅谈APT攻击