您的位置:首页 > 其它

八大内部排序 -- 堆排序

2016-08-31 18:15 218 查看
堆排序(heap-sort):把关键字序列看成一颗二叉树,树上的非叶子节点的值均小于(或者大于)其左右子节点的值,所以树根肯定是这个序列的最小值或者最大值。堆排序的核心是树节点的调整,以维护一个最小堆树(或者最大堆),建堆树也是通过堆调整建立的。

时间复杂度为:O(nlong)  ,不稳定的排序

代码如下:

#include <iostream>
using namespace std;

void print(int *a,int n){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}

void heap_ajust(int *a,int s,int len){
int key_value = a[s];
for(int j = 2*s;j<=len;j*=2){
if(j<len && a[j+1]>a[j])
j++;
if(key_value > a[j])
break;
a[s] = a[j];
s=j;
}
a[s] = key_value;
}

void heap_sort(int *a,int n){
// build heap
for(int i=n/2;i>=1;i--){
heap_ajust(a,i,n);
}
// sort
for(int i=n;i>0;i--){
swap(a[i],a[1]);
heap_ajust(a,1,i-1);
}
}

int main()
{
int *a;
int n;

cin>>n;
a= new int[n+1];

for(int i=1;i<=n;i++){
cin>>a[i];
}

heap_sort(a,n);
print(a,n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: