堆排序(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;
}