網站首頁 編程語言 正文
1.堆的概念及結構
如果有一個關鍵碼的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉樹(二叉樹具體概念參見——二叉樹詳解)的順序存儲方式存儲在一個一維數組中,并滿足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,則稱為小堆(或大堆)。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。
堆的性質:
- 堆中某個節點的值總是不大于或不小于其父節點的值;
- 堆總是一棵完全二叉樹。
2.堆的實現
堆的實現請參見——二叉樹詳解(堆的實現)
2.1 堆的向下調整算法
(此文章都已建小堆為例)
向下調整算法前提:當前樹左右子樹都是小堆
核心思想:選出左右孩子中小的那個,和父親交換,小的往上浮,大的往下沉,這里是小堆,如果是大堆則相反。
代碼實現
void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } //堆向下調整算法 void AdjustDown(int *a, int n, int root) { int parent = root; int child = parent * 2 + 1; while (childa[child + 1] && child+1 < n) ++child; if (a[child] < a[parent]) { swap(&a[child], &a[parent]); parent = child; child = parent * 2 + 1; } else break; } }
2.2 堆的向上調整算法
使用場景:向上調整算法適用于向堆中插入數據,當向堆中插入數據就可能會導致堆失去大堆或者小堆的性質,此時需要重新調整,向上調整的思路與向下調整算法的思路類似,向上調整算法只需要從插入結點位置開始和父節點比較。
圖示:
代碼實現:
void AdjustUp(int *a, int child) { int parent = (child - 1) / 2; while (child > 0) { if (a[parent] > a[child]) { swap(&a[parent], &a[child]); child = parent; parent = (child - 1) / 2; } else break; } }
2.3 建堆(數組)
從最后一個非葉子節點位置行依次開始調整,如圖:
代碼實現:
int parent = (n-2) / 2; //首先對每一個非葉子節點進行一次向下調整算法,保證每個非葉子節點的 //孩子都小于它的父節點,然后可得到最小值,就在堆的頂端的父節點(也叫做建小堆) while (parent >= 0) { AdjustDown(a, n, parent); --parent; }
2.4 堆排序
升序建大堆,降序建小堆
void HeapSort(int *a, int n) { int parent = (n-2) / 2; //首先對每一個非葉子節點進行一次向下調整算法,保證每個非葉子節點的 //孩子都小于它的父節點,然后可得到最小值,就在堆的頂端的父節點(也叫做建小堆) while (parent >= 0) { AdjustDown(a, n, parent); --parent; } int end = n-1; while (end>0) { //將堆頂的數與最后的end,以此循環,進行交換就可得到有序序列 //注意:建小堆,得到降序序列 swap(&a[end], &a[0]); AdjustDown(a, end, 0); --end; } }
2.5 堆排序的時間復雜度
所以建堆時間復雜度為O(N);
向下調整算法時間復雜度 O(logN);
所以堆排序的時間復雜度為 O(N*logN)
原文鏈接:https://blog.csdn.net/weixin_45796387/article/details/120461189
相關推薦
- 2022-11-10 C語言宏定義容易認不清的盲區梳理_C 語言
- 2022-09-05 SpringBoot 自動配置原理
- 2022-11-20 Go語言操作Excel利器之excelize類庫詳解_Golang
- 2022-11-01 golang連接MongoDB數據庫及數據庫操作指南_Golang
- 2022-11-09 Android?使用maven?publish插件發布產物(aar)流程實踐_Android
- 2022-03-08 Docker自定義網絡詳細介紹_docker
- 2022-05-08 總結Python函數參數的六種類型_python
- 2022-05-10 ASP.NET?Core使用Log4net實現日志記錄功能_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支