堆排序【模板】
很认真地看完了《算导》的排序之前的所有部分,除了算法复杂度那一章的数学要求太高,难以完全驾驭以外,其他的部分还是很好理解的。。。
争取把《算导》里面出现的算法都自己实现,制作自己的模板,以后好用。。。堆排序虽然在一般的时候是没有快排好用,但是在优先队列里面很好用,所以也是很有力的武器!
这个堆排序模板是我基本完全按照《算法导论》里面自己一个字一个字的敲上去的,调试的时候修改了几个小地方:1.heapsize,开始我准备写一个函数的,但是因为在sort函数里面要执行自减操作,所以必须要用全局变量才好处理;2.《算导》里面是从数组下标的1开始的,所以我在赋初值的时候将 A[0] 跳过了
#include <iostream> //堆长度 int heapsize; //大顶堆化 void MAX_HEAPIFY(int A[],int i) { int l=2*i; //把 i 的左儿子 下标 赋给l int r=2*i+1; //把 i 的左儿子 下标 赋给r int largest; //3个里面最大的下标 if(l<=heapsize && A[l]>A[i]) largest=l; else largest=i; if(r<=heapsize && A[r]>A[largest]) largest=r; if(largest!=i) { //交换 A[largest] 和 A[i] int tmp=A[largest]; A[largest]=A[i]; A[i]=tmp; MAX_HEAPIFY(A,largest); } } //建堆 void BUILD_MAX_HEAP(int A[]) { int i; for(i=(int)(heapsize/2);i>=1;i--) MAX_HEAPIFY(A,i); } //堆排序 void HEAPSORT(int A[]) { BUILD_MAX_HEAP(A); //ok int i; int tmp; for(i=heapsize;i>=2;i--) //A[1] 必定是最大的 { //交换 A[1] 和 A[i] tmp=A[1]; A[1]=A[i]; A[i]=tmp; heapsize--; MAX_HEAPIFY(A,1); } } int main() { int A[6]={0,5,3,2,1,4}; //ok int n=sizeof(A)/sizeof(int)-1; heapsize=n; HEAPSORT(A); for(int i=1;i<=n;i++) printf("%d ",A[i]); return 0; }
运行结果为:
1 2 3 4 5
最后更新:2017-04-03 14:53:55
上一篇:
Android 多分辨率屏显设计及其兼容性测试
下一篇:
技术人员谈管理之整体管理案例论文
IOS平台构建TensorFlow应用教程详解(附源码)(二)
H5???????????????????????????????????????-??????-????????????-?????????
android的<uses-feature>详解
阿里云首推免费人脸识别SDK 让每个APP轻松拥有短视频AR特效
Action Bar for Android
阿里数据库内核月报:2015年08月
软件事务内存导论(十一)-STM的局限性
init/loadView/viewDidLoad/viewDidUnload
Oracle查询某个字段的第一个字为汉字的查询方法
yum 小技巧