網站首頁 編程語言 正文
看了一下優先隊列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交換2個操作。如果建的是最大堆,那么交換的時候,父節點就和最大的子節點比較,如果它比最大的子節點還大,那就不用比了。因為后面還有一個交換的操作,所以最后得到的就是由小到大的排序;反之,得到的就是由大到小的排序。
#include<iostream> #include<algorithm> using namespace std; void maxHeapify(int arr[], int start, int end) { int dad = start; int son = dad * 2 + 1; while (son <= end) { if (son + 1 <= end && arr[son] < arr[son + 1]) { son++;// 找出最大的兒子 } // 父節點跟最大的子節點比較即可 if (arr[dad] > arr[son]) { return; } else { // 交換父節點與子節點 swap<int>(arr[dad], arr[son]); // 這個時候父節點位置滿足要求了,下面的子節點不一定滿足要求 // 還需要檢查有沒有導致下面的子節點受到影響 dad = son; son = dad * 2 + 1; } } } void heapSort(int arr[], int len) { // 初始化,從最后一個父節點開始,調整所有的父節點 for (int i = len / 2 - 1; i >= 0; i--) { maxHeapify(arr, i, len - 1); } // 這個時候找到了最大元素(堆頂), // 將其和最后一個元素交換。(這樣就會得到由小到大的排序) for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); // 將交換之后除了最后一個元素的所有元素,重新調整為最大堆 maxHeapify(arr, 0, i - 1); } } int main() { int arr[]{ 5,3,4,9,7,8,1,2,10,23,15 }; int len = int(sizeof(arr) / sizeof(*arr)); heapSort(arr, len); cout << "排序之后:" << endl; for (auto item : arr) { cout << item << " "; } return 0; }
這幾行代碼干的事情,就是如下圖所示,由低向高,逐漸生成最大堆,找到最大元素
緊接著的后面的for
循環就是最后一個元素和堆頂元素交換,然后重新調整除了交換到后面來的元素,直到只有堆頂一個元素。就排好序了。
原文鏈接:https://blog.csdn.net/sdhdsf132452/article/details/128779508
相關推薦
- 2022-05-02 C語言如何實現一些算法或者函數你知道嗎_C 語言
- 2022-05-20 Shell編寫格式和執行方式
- 2022-12-21 Android?全局通知彈窗示例分析詳解_Android
- 2023-11-26 在 el-table 中嵌入 el-checkbox el-input el-upload 多組件,
- 2022-10-09 淺談重繪和回流的解析_基礎教程
- 2022-07-12 Linux命令之美|linux使用tar誤解壓之后,如何刪除解壓后的文件
- 2024-03-13 QAobject修改excel字體亂碼問題
- 2022-04-07 一篇文章帶你學習Python3的高階函數_python
- 最近更新
-
- 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同步修改后的遠程分支