
【算法】手撕堆排序
发布日期:2021-05-04 16:43:56
浏览次数:34
分类:精选文章
本文共 1557 字,大约阅读时间需要 5 分钟。
文章目录
参考极客时间
堆排序
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),但是实际软开中,快排性能更好。
堆性质:
- 堆必须是完全二叉树(保证利用数组存储堆时,由下标i快速找到父节点 ( i − 1 ) / 2 (i-1)/2 (i−1)/2,左右子节点 2 ∗ i + 1 , 2 ∗ i + 2 2*i+1,2*i+2 2∗i+1,2∗i+2)
- 堆中每个节点必须大于等于(小于等于)子节点
- 支持插入、删除堆顶元素(并且要堆化)
- 如果数组存储n个元素,最后一个非叶子节点下标为 n / 2 − 1 n/2-1 n/2−1
堆排序(从小到大,利用最大堆和数组)
- 从后往前堆化数组元素,此时最大元素在首位置
- 交换元素
- 堆化
代码
#include#include using namespace std;void HeapSort(int* array, int n);void buildHeap_(int* array, int n);//建立最大堆void heapify_(int* array, int n, int idx);//调整idx节点满足堆性质void swap_(int* array, int aIdx, int bIdx);void HeapSort(int* array, int n) { if (array == nullptr || n <= 1) return; buildHeap_(array, n); int idx = n - 1; while (idx >= 0) { swap_(array, 0, idx); idx--; heapify_(array, idx + 1, 0);//堆化堆顶元素 }}void buildHeap_(int* array, int n) { //从最后一个非叶子节点从后往前开始堆化 for (int i = n / 2 - 1; i >= 0; i--) heapify_(array, n, i);//堆化i节点}void heapify_(int* array, int n, int idx) { while (true) { int leftChildIdx = 2 * idx + 1; int rightChildIdx = 2 * idx + 2; int maxIdx = idx; if (leftChildIdx < n && array[leftChildIdx] > array[maxIdx]) maxIdx = leftChildIdx; if (rightChildIdx < n&& array[rightChildIdx] > array[maxIdx]) maxIdx = rightChildIdx; if (maxIdx == idx) break; swap_(array, idx, maxIdx); idx = maxIdx; }}void swap_(int * array, int a, int b){ int tmp = array[a]; array[a] = array[b]; array[b] = tmp;}int main() { int array[9] = { 7,5,19,8,4,1,20,13,16 }; HeapSort(array, 9); for (auto i : array) cout << i << " "; cout << endl; getchar(); return 0;}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月26日 00时06分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
nodejs中npm常用命令
2021-05-09
基于Vue2.0+Vue-router构建一个简单的单页应用
2021-05-09
基于vue2.0实现仿百度前端分页效果(二)
2021-05-09
JS魔法堂:函数重载 之 获取变量的数据类型
2021-05-09
时间序列神器之争:Prophet VS LSTM
2021-05-09
SpringBoot中关于Mybatis使用的三个问题
2021-05-09
MapReduce实验
2021-05-09
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2021-05-09
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2021-05-09
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
2021-05-09
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
2021-05-09
[apue] popen/pclose 疑点解惑
2021-05-09
[apue] getopt 可能重排参数
2021-05-09
移动互联网恶意软件命名及分类
2021-05-09
adb shell am 的用法
2021-05-09
PySide图形界面开发(一)
2021-05-09
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2021-05-09
三角网格体积计算
2021-05-09
现代3D图形编程学习-基础简介(2) (译)
2021-05-09