堆排序
来源:互联网 发布:创业软件股份ceo 编辑:程序博客网 时间:2024/06/15 22:32
堆排序:
1,开始建堆,已一个小根堆为例:(图片摘自别人,与下面的排序代码无关)
构造好了堆之后,下面就是排序的过程:
直接上代码了:
#include<iostream>using namespace std;void sift(int a[],int m,int n);void sorts(int a[],int n);void swaps(int *sa,int *b);int main(){ int a[7] = {0,23,45,1,4,5,18}; sorts(a,6); for(int i = 1 ; i<=6; i++) cout<<a[i]<<'\t';}void sift(int a[],int m,int n)//形成堆,m为要排的元素,n为a的个数{ int i = m, j = 2*m; while(j <= n) { if(j<n&&a[j]<a[j+1])j++; if(a[i]>a[j])break; else { swaps(&a[i],&a[j]); i = j; j = 2*i; } }}void sorts(int a[],int n)//排序{ int i = n/2; for(int j = i ; j>=1 ; j--) { sift(a,j,n); } for(int k = 1; k<n ; k++)//形成的堆,将堆头,和最后一个叶子节点交换 { swaps(&a[1],&a[n-k+1]); sift(a,1,n-k);//重新排列 }}void swaps(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp;}
由于是从第二个元素开始排序的也就是a[1],所以第一个元素没有排序,可以在初始化的时候声明为0。
2017/8/7/13:32
今天在算法导论上看到一种用递归实现的方法,只需要把上面的sift方法换一下即可:
void sift2(int a[],int m,int n){ int i = m,j = 2*m,k=2*m+1; int largest; if(largest > n)return; if(a[i]>a[j])largest = i; else j = largest; if(a[k]>a[largest]) largest = k; if(i!= largest) { swaps(&a[i],&a[largest]); sift2(a,largest,n); }}
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- SVM多分类器
- Java接口以及抽象类-理论
- c语言读写文件
- MySQL列类型和列上约束
- 左边固定200px,右边自适应的几种方法
- 堆排序
- Cocos2d-x实战项目开发:加法计算器
- 一个优秀的Linux程序员必须知道的快捷键,你知道几个?
- mq-4-rmq安装
- 黑客叔叔(雨袭团)内部交流题(第一季1.0.2)
- js中的call和apply
- HDU 1197
- Hello Baidu Map
- Codeforces 833B