堆排序
2016-02-19 23:05
267 查看
#include <iostream> #include <cstdio> using namespace std; void heapAdjust(int a[], int i, int sizeOfheap)//调整堆 (调整范围:i与i下面的子树) { int lchild = 2 * i; //i的左孩子节点序号 int rchild = 2 * i + 1; //i的右孩子节点序号 int maxs = i; //先默认第i个是最大的 if(i <= sizeOfheap / 2) //不调整叶子节点 { if(lchild <= sizeOfheap && a[lchild] > a[maxs]) maxs = lchild; if(rchild <= sizeOfheap && a[rchild] > a[maxs]) maxs = rchild; if(maxs != i) { swap(a[i], a[maxs]); //注意下标没换 heapAdjust(a, maxs, sizeOfheap); //避免调整之后以max为父节点的子树不是堆 } } } void BuildHeap(int a[], int n) { int i; //非叶节点最大序号值为size/2 for(i = n / 2; i >= 1; i--) //从下面往上面调整 heapAdjust(a, i, n); } void HeapSort(int a[], int n) { int i; BuildHeap(a, n); for(i = n; i >= 1; i--) { swap(a[1], a[i]); //最后面的数和第一个数交换,结果最后一个数变为最大的树了 heapAdjust(a, 1, i - 1); } } int main() { int sizeOfheap; int a[100]; while(scanf("%d", &sizeOfheap) == 1 && sizeOfheap > 0) { int i; for(i = 1; i <= sizeOfheap; i++) //从下标1开始到n scanf("%d", &a[i]); HeapSort(a, sizeOfheap); for(i = 1; i <= sizeOfheap; i++) printf("%d ",a[i]); printf("\n"); } return 0; }
相关文章推荐
- 初用 IRC & freenode
- 【tarjan+缩点】POJ1236[IOI1996]-Network of Schools
- 插入排序
- kmp
- [Android Pro] Android 官方推荐 : DialogFragment 创建对话框
- 封装一个cout方法,能实现如此调用:cout(a)(b)(c)(d)(e)… 并且返回的值为参数连剩的结果,即a*b*c*d*e*…。如cout(1)(3)(7) 得到21
- ViewPager与PagerAdapter深度解析
- 带权并查集 poj1182
- Unity3D热更新 初识脚本
- 关于基础的数据范围
- Android Handler内存泄露分析
- Android Wear 进阶 - 3 Creating Custom UIs for Wear Devices 创建自定义的手表设备UIs
- 关于Java小项目——图书管理系统的总结
- CALayer初认识
- RPi 2B 中文语言包
- 普通并查集之宗教问题(题目)
- MySQL,DML语句CUD的操作
- redis源码阅读(2)---- adlist分析
- 普通并查集基本操作
- 关于组合数与Lucas定理