堆排序是不稳定的排序,算法时间复杂度三种情况下均为O(nlog(n)):
堆排序主要思想参考: http://jingyan.baidu.com/article/5225f26b057d5de6fa0908f3.html
本人经过测试的C++(大顶堆)实现如下:
/**堆排序**/
#include<iostream>
using namespace std;
void swapA(int n[],int a,int b){
int tmp=n[a];
n[a]=n[b];
n[b]=tmp;
}
/*调整堆*/
void heapAdjust(int a[],int size,int parent){
if(size<=1)
return;
//只处理非叶子节点
if(parent<=size/2){
int lchild=parent*2;
int rchild=parent*2+1;
int max=parent;
if(lchild<=size&&a[lchild]>a[max]){
max=lchild;
}
if(rchild<=size&&a[rchild]>a[max]){
max=rchild;
}
if(max!=parent){
swapA(a,parent,max);
heapAdjust(a,size,lchild);
heapAdjust(a,size,rchild);
}
}
}
/*建立初始堆*/
void buildHeap(int a[],int size){
for(int i=size/2;i>=1;i--){
heapAdjust(a,size,i);
}
}
int main(){
int n;
cin>>n;
int *a=new int[n+1];
a[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
buildHeap(a,n);
for(int i=n;i>=1;i--){
swapA(a,i,1);
heapAdjust(a,i-1,1);
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}