堆排序
来源:互联网 发布:直播平台系统源码 编辑:程序博客网 时间:2024/05/29 03:50
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定
基本原理:以大顶堆-非降序排序为例:首先先利用数组构建大顶堆,然后将堆顶元素(最大值)和最后一个元素进行交换,在对1~n-1个元素进行调整使其依然为一个大顶堆,重复交换和调整操作直到堆中只剩下一个元素,则排序完成。
代码:
/*大学课程中各种排序算法的实现语言:C++作者:Kylin.C*/#include<iostream>#include<vector>using namespace std;//堆排序void HeapAdjust(vector<int> &arr, int i, int length){ int maxChild; for (; i < length / 2; i = maxChild) { maxChild = 2 * i + 1;//先令maxChild等于节点i的左子节点下标 if (maxChild < length - 1 && arr[maxChild + 1]>arr[maxChild]) ++maxChild;//如果右子节点存在且大于左子节点则令maxChild等于右子节点下标 if (arr[i] < arr[maxChild]) swap(arr[i], arr[maxChild]); else break; }}void HeapSort(vector<int> &arr){ if (arr.size() == 0) return; for (int i = arr.size() / 2 - 1; i >= 0; --i) HeapAdjust(arr, i, arr.size()); for (int i = arr.size() - 1; i > 0;--i) { swap(arr[0], arr[i]); /*交换数据的另一种写法 arr[i]=arr[0]^arr[i]; arr[0]=arr[0]^arr[i]; arr[i]=arr[0]^arr[i]; */ HeapAdjust(arr, 0, i); }}int main(){ vector<int> arr{ 4, 2, 1, 4, 3, 8, 6, 5, 6 }; HeapSort(arr); for (auto a : arr) cout << a << " "; cout << endl; system("pause"); return 0;}
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- Ubuntu安装冲突软件导致窗口顶部窗体消失,Unity启动器消失,桌面顶部任务栏消失,快捷键失效解决方法
- SPOJ
- 导航栏制作
- 序列化的作用
- 系统工具
- 堆排序
- 中位数计数
- Oracle中的日期运算
- 用户管理及权力下放命令
- 最新版本微信和QQ红包自动领取安装包
- HDU
- 01-复杂度2 Maximum Subsequence Sum(25 分)
- git stash 恢复
- spring-retry注解方式使用(断路器,重试)