堆排序
来源:互联网 发布:作图软件app 编辑:程序博客网 时间:2024/06/05 05:04
堆的性质,是永远最大的在上面(最大堆,最小堆反之)
//====================堆排序==============================//堆取左右节点和父节点的操作int myleft(int i){ return 2*i+1;}int myright(int i){ return 2*i+2;}int myparent(int i){ return (i-1)/2;}//打印堆,本层打印完毕,则下一层已经全部入队列void printheap(int *A,int heapsize){ queue<int> q; q.push(0); int i=0; int curnum=1; int nextnum=0; int l,r; while(!q.empty()){ i=q.front(); q.pop(); curnum--; cout<<A[i]<<" "; l=myleft(i); r=myright(i); if(l<heapsize){ q.push(l); nextnum++; } if(r<heapsize){ q.push(r); nextnum++; } if(curnum==0){ curnum=nextnum; nextnum=0; cout<<endl; } } }//维护最大堆的性质,保证堆顶的数一定大于下面的数,前提是子堆已经是最大堆了void myMaxHeap(int *A,int i,int heapsize){ int l=myleft(i); int r=myright(i); int largest=i; if(l<heapsize&&A[l]>A[largest]){ largest=l; } if(r<heapsize&&A[r]>A[largest]){ largest=r; } if(largest!=i){ swap(A[i],A[largest]); myMaxHeap(A,largest,heapsize); }}//建堆void mybuildheap(int * A,int len){ for(int i=len-1;i>=0;i--){//自下而上 myMaxHeap(A,i,len); }}//排序void myheapsort(int * A,int bg,int ed){ int len=ed-bg; mybuildheap(A+bg,len); for(int i=ed-1;i>=bg;i--){ swap(A[i],A[bg]); len--; myMaxHeap(A+bg,0,len); }}//======================================================
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- HTML+CSS+TABLE实现简单注册
- UVa 10817 Headmaster‘s Headache 【01背包 位运算】
- L2-011. 玩转二叉树
- MySQL的主从复制配置(异步,半同步)
- Hibernate映射多对多
- 堆排序
- 算法:字符串匹配算法整理
- Camel之Quartz2
- 第七届蓝桥杯【省赛试题2】生日蜡烛
- 静态方法与实例方法的浅显区别
- arm汇编函数调用参数传递规则
- 翻转数组
- java中是值传递还是引用传递?
- 把一个2.97M的文件分割成两个