堆排序
来源:互联网 发布:淘宝店卖家信誉等级表 编辑:程序博客网 时间:2024/06/05 12:28
堆排序的思想:根据堆的定义,堆的根节点不是最大值就是最小值(最大堆或最小堆),通过每次拿走根节点,然后再重新对堆进行调整,就能保证拿走的序列顺序是按从小到大或是从大到小排列的。每次拿走根节点,堆的节点数就减一,取最后一个叶子节点代替根节点,调整堆。直到堆的节点数量为1。
最大堆
堆调整:
void adjust_heap(int a[],int hole,int n){int left=2*hole+1;int t;while(left<n-1){ // hole含有左右孩子,并交换hole和孩子当中的较大的节点if(a[left]<a[left+1])left++;if(a[hole]<a[left]){t=a[hole];a[hole]=a[left];a[left]=t;hole=left;left=2*hole+1;}elsereturn;}if(left==n-1){ //hole只有左孩子if(a[hole]<a[left]){ t=a[hole]; a[hole]=a[left]; a[left]=t; hole=left;}elsereturn;}return ;}
堆的建立:
void built_heap(int a[],int n){ if(n==0||n==1) return;for(int i=(n-2)/2;i>=0;i--) //从第一个不是叶子节点开始,从下往上调整。adjust_heap(a,i,n);}
堆排序:
void heap_sort(int a[],int n){int m;for(int i=0;i<n;i++) //每次拿走根节点,然后是倒数第一个节点赋给根节点,节点总数少一{adjust_heap(a,0,n-i);m=a[0];a[0]=a[n-i-1];a[n-i-1]=m;}}
int main(){int a[]={12,42,122,-90,-32,25,21,14};built_heap(a,8);heap_sort(a,8);for(int i=0;i<8;i++)cout<<a[i]<<" ";while(1);return 0;}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 【树分治】 ZOJ Travel
- java.util.vector中的vector的详细用法
- 解决sunos solaris中的PS命令无法正常显示全部内容的问题
- signed char的取值范围,在内存中的存储形式
- Hibernate parameter binding examples
- 堆排序
- iOS开发判断TextField中输入的数字为小数点后两位
- Android Studio导入项目的几种方法
- android中属性动画
- 找出数列单独的数字
- 给ASP.NET MVC及WebApi添加路由优先级
- 【网络】(十二)UDP简介
- 网络IO之阻塞、非阻塞、同步、异步总结
- 概率论