排序-堆排序
2016-04-05 20:22
204 查看
堆排序
基本思想:就是先构建一次大顶堆,通过树来将最大的数放在树根,然后与最后一个节点交换位置,最后将除去最后一个最大的元素之外的所有元素重新构建大顶堆。
代码:
main测试
欢迎指正
基本思想:就是先构建一次大顶堆,通过树来将最大的数放在树根,然后与最后一个节点交换位置,最后将除去最后一个最大的元素之外的所有元素重新构建大顶堆。
代码:
//构建大顶堆 void HeapAdjust(int* L, int s, int length) { int i; int temp = L[s];//内部节点 for (i = 2 * s; i <= length; i *= 2) { if (i < length && L[i] < L[i + 1])//找到最大的叶子节点的下标 i代表左节点下标,i + 1代表右节点下标 { i++; } if (temp >= L[i])//内部节点大于叶子节点就不用构建大顶堆了 { break; } L[s] = L[i];//否则将内部节点s赋值为最大的叶子节点的值 s = i;//s改为存储叶子节点下标 } L[s] = temp;//叶子节点被赋值为起初的内部节点,即实现了内部节点和最大的叶子节点的交换 } //堆排序 void HeapSort(int* L, int length) { int i; for (i = length / 2; i >= 0; i--)//数组包含0,所以循环到0 { HeapAdjust(L, i, length);//调整成大顶堆 } for (i = length - 1; i > 0; i--)//循环到i = 1结束,因为i - 1 > 0 { myswap(L, 0, i);//交换顶堆元素和最后一个元素 HeapAdjust(L, 0, i - 1);//将剩下的 0 - length - 1调整成大顶堆 } }
main测试
int main(void) { int x[10] = { 50, 10, 90, 30, 70 , 40, 80, 60, 20, 100}; showArray(x, 10);//显示数组元素 HeapSort2(x, 10); printf("\n"); showArray(x, 10); system("pause"); return 0; }
欢迎指正
相关文章推荐
- 2016年上半年系统集成中项4月4日作业
- 程序运行时的内存空间分布(二)堆和栈的比较
- 捷通华声面试总结(待更新)
- 山东省第二届ACM省赛题——Binomial Coeffcients(组合)
- Android RecyclerView 使用完全解析 体验艺术般的控件
- Codeforces Round #252(Div. 2) 441D. Valera and Swaps 置换群
- VS2013常用快捷键:
- unix环境多进程编程----用到的32个系统调用详解
- fragment2中获取fragment1布局,找到控件设置f1里边的内容
- android 管理应用的内存
- git命令
- 阿里云服务器Tomcat搭建以及域名绑定
- 初学android开发--day01
- 第六周项目1
- 分析驱动程序在IRQL>=DISPATCH_LEVEL时和DPC过程中不能用KeWaitForSingleObject等待对象的原因
- hdu3360+二分匹配(匈牙利算法)
- hdu-2665 Kth number(划分树)
- Dom编程的入门
- CodeForces-237C- Primes on Interval
- 第五周 项目1(3)