算法——排序——堆排序图解动画
快速排序
- 簡介
- 排序過程
- 1.生成完全二叉樹
- 2.構(gòu)造大頂堆
- 3.循環(huán)刪除堆頂元素
- 時間復雜度
- 空間復雜度
- 穩(wěn)定性
簡介
????????堆排序 heapsort,是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設計的一種排序算法。堆是完全二叉樹,分為大頂堆和小頂堆。大頂堆的特點是指任何一個父節(jié)點的值,都大于等于它左右孩子節(jié)點的值。小頂堆的特點是指任何一個父節(jié)點的值,都小于等于它左右孩子節(jié)點的值。
文章中使用的動畫網(wǎng)站地址:
限 pc: 排序算法動畫 :http://www.donghuasuanfa.com/sort/heapSortPortal
算法一覽表:https://blog.csdn.net/ww753951/article/details/106862328
排序過程
????????算法分為三步驟。
????????一:將數(shù)組構(gòu)造成二叉樹
????????二:將完全二叉樹構(gòu)造成大頂堆,樹中所有父元素都比子元素大。構(gòu)造大頂堆的步驟。1.首先從右至左,從下至上遍歷非葉子節(jié)點,比較非葉子節(jié)點和倆個子節(jié)點的較大值,如果非葉子節(jié)點小于葉子節(jié)點較大值,則互換位置,保證調(diào)整后的非葉子節(jié)點大于子節(jié)點。2.互換位置后,因為有可能新的葉子節(jié)點比葉子節(jié)點的葉子節(jié)點還小,所以需要重復比較和互換位置的操作。維持大頂堆的結(jié)構(gòu)。
????????三:循環(huán)刪除堆頂元素,移到集合尾部。將最后一個元素移動到堆頂,調(diào)節(jié)堆產(chǎn)生新的堆頂。新的堆重復比較非葉子節(jié)點和葉子節(jié)點的步驟。保證堆的特點。
????????示例以3,4,2,1,6,5為數(shù)組進行演示。
????????演示的動畫來源:堆排序算法動畫地址 http://www.donghuasuanfa.com/sort/heapSortPortal
1.生成完全二叉樹
????????首先將數(shù)組生成完全二叉樹,數(shù)組3,4,2,1,6,5生成后的二叉樹如下圖所示。
2.構(gòu)造大頂堆
????????1.首先從右至左,從下至上層序遍歷非葉子節(jié)點,比較非葉子節(jié)點和倆個子節(jié)點的較大值,如果非葉子節(jié)點小于葉子節(jié)點較大值,則互換位置,保證調(diào)整后的非葉子節(jié)點大于子節(jié)點。
????????2.互換位置后,因為有可能新的葉子節(jié)點比葉子節(jié)點的葉子節(jié)點還小,所以需要重復比較和互換位置的操作。維持大頂堆的結(jié)構(gòu)。
????????示例:
????????二叉樹從右至左,從下至上層序遍歷,當前二叉樹最右下側(cè)非葉子節(jié)點為2,所以首先遍歷的節(jié)點為2。
????????獲取節(jié)點2的兩個葉子節(jié)點較大的節(jié)點,因為當前2節(jié)點只有一個節(jié)點5,所以獲取的為5。再比較2和5的大小,因為構(gòu)造的是大頂堆,且葉子節(jié)點5大于2。 所以需要互換位置。
????????繼續(xù)遍歷下一個節(jié)點,下一個非葉子節(jié)點為4。
????????獲取節(jié)點4的兩個葉子節(jié)點1和6較大的節(jié)點,所以獲取的為6。再比較4和6的大小,因為構(gòu)造的是大頂堆,且葉子節(jié)點6大于4。 所以需要互換位置。
????????繼續(xù)遍歷下一個節(jié)點,下一個非葉子節(jié)點為3。
????????獲取節(jié)點3的兩個葉子節(jié)點6和5較大的節(jié)點,所以獲取的為6。再比較3和6的大小,因為構(gòu)造的是大頂堆,且葉子節(jié)點6大于3。 所以需要互換位置。
????????因為交換位置后,交換后的節(jié)點不一定比子節(jié)點大。所以需要重新處理二叉樹。例如示例所示。3節(jié)點交換位置后,比子節(jié)點要小,所以需要重新處理二叉樹,滿足大頂堆的特性。3節(jié)點找到兩個子節(jié)點的較大值4。
????????因為構(gòu)造的是大頂堆,且葉子節(jié)點4大于3。 所以需要互換位置。最后大頂堆的構(gòu)造結(jié)束。
????????整體動圖如下所示:
3.循環(huán)刪除堆頂元素
????????循環(huán)刪除堆頂元素,移到集合尾部。將最后一個元素移動到堆頂,調(diào)節(jié)堆產(chǎn)生新的堆頂。新的堆重復比較非葉子節(jié)點和葉子節(jié)點的步驟。保證堆的特點。
????????堆頂元素為6。末尾元素為2,交換位置后則6元素為已排序元素,如下圖所示。
????????因為交換位置后,堆頂元素2小于子節(jié)點4和5, 所以不滿足大頂堆性質(zhì)。
????????需要重復構(gòu)造大頂堆步驟,交換元素位置,調(diào)整二叉樹,最終形成大頂堆。
????????然后重復步驟,再次交換元素位置,則5元素為已排序元素。
????????重復上述步驟,直至所有元素排序完成。
-------分割線-------
時間復雜度
| O(N?log2N)O(N*log_{2}N) O(N?log2?N) | O(N?log2N)O(N*log_{2}N) O(N?log2?N) | O(N?log2N)O(N*log_{2}N)O(N?log2?N) |
????????堆排序整體的時間復雜度為:O(N * log2N)。整體主要由構(gòu)建初始堆+交換堆頂元素和末尾元素并重建堆兩部分組成。其中第一部分構(gòu)建初始堆經(jīng)推導復雜度為O(n),
????????在第二部分交換并重建堆的過程中,需循環(huán)數(shù)組剩余元素,共交換n-1次,而重建堆的過程中,根據(jù)完全二叉樹的性質(zhì),[log2(n-1),log2(n-2)…1]逐步遞減,所以循環(huán)剩余數(shù)組和每次數(shù)組調(diào)整堆的過程累計近似為N * log2N。因為第一部分的O(N)基本忽略。所以堆排序時間復雜度一般認為就是O(N * log2N)。
空間復雜度
????????堆排序只需要元素交換位置即可,無需額外空間, 所以空間復雜度為1。
穩(wěn)定性
????????在構(gòu)建大頂堆時,元素之間的順序無法保證。所以為不穩(wěn)定排序。
總結(jié)
以上是生活随笔為你收集整理的算法——排序——堆排序图解动画的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大津阈值分割(OSTU)
- 下一篇: switch芯片上的QoS,VLAN介绍