堆排序
来源:互联网 发布:37轩辕剑祥云进阶数据 编辑:程序博客网 时间:2024/05/15 23:51
/* * *堆排序:对简单选择排序的一种改进 *①堆是完全二叉树;②有大顶堆与小顶堆之分 * *注意是从1号位开始,放入数据并调整,则i节点的左孩子是2*i,右孩子是2*i+1; * **/ #include <iostream>#include<algorithm>//algorithmusing namespace std;void HeapAdjust(int *a,int i,int size){ //调整堆 int lchild=2*i; //i的左孩子节点序号 int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量,初始假定第i个节点是最大的。 if(i<=size/2){ //如果i是叶节点就不用进行调整 if( lchild<=size && a[lchild]>a[max] ){ max=lchild; } if( rchild<=size && a[rchild]>a[max] ){ max=rchild; } if(max!=i){ swap(a[i],a[max]); HeapAdjust(a,max,size); //调整之后,避免以max为父节点(原a[i]的值)的子树不是堆 } } }void HeapSort(int *a,int size) //堆排序 { int i;for(i=size/2;i>=1;i--){ //非叶节点最大序号值为size/2HeapAdjust(a,i,size); } for(i=size;i>=1;i--){ swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面,将余下元素重新建立为大顶堆 HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆 }} int main(int argc, char *argv[]){ //int a[]={16,7,3,20,17,8};//6 16 7 3 20 17 8 int a[10]; int size; while(scanf("%d",&size)==1&&size>0) { int i; for(i=1;i<=size;i++)//注意从a[1]开始存数据 cin>>a[i]; HeapSort(a,size); for(i=1;i<=size;i++) cout<<a[i]<<" "; cout<<endl; } return 0;}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- hdu 1150 Machine Schedule(二分图求最小点覆盖)
- 关于java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()错误
- Maven + Eclipse + Tomcat - 开启项目调试之旅
- (摘自windows核心编程之用内核对象进行线程同步)
- 通达单点登录接口
- 堆排序
- HttpWebRequest:基础连接已关闭异常:The underlying connection was closed。
- Mybatis实现【7】 --基于接口编程的原理
- Codeforces Round #249 (Div. 2)
- 相机里面的照片怎么恢复,相机照片被删怎么恢复
- 学习如何使用官方Assets Store 导入游戏资源
- HashMap,LinkedHashMap和Hashtable类的深入剖析与理解
- ANDROID 系统网络连接和管理机制--状态模式
- 计数排序