堆排序是不稳定的排序,平均情况和最坏情况的算法复杂度为O(NlgN),空间复杂度为:O(1)
#include<stdio.h>
#include<string.h>
void swap(int &a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void HeapAjust(int a[],int i,int n)
{
int rc=i;
int rs=a[rc];
for(int j=2*rc;j<=n;j*=2)
{
if(j<n&&a[j]<a[j+1]) //左右子树选个大的
j++;
if(rs>a[j]) //调整是否结束
break;
a[rc]=a[j]; //调整堆
rc=j; //继续向下
}
a[rc]=rs; //节点a[i]的最终位置
}
void HeapSort(int a[],int n)
{
int i;
for(i=n/2;i>0;i--) //成堆
{
HeapAjust(a,i,n);
}
for(i=n;i>1;i--) //交换,调整
{
swap(a[1],a[i]);
HeapAjust(a,1,i-1);
}
}
void main()
{
int a[10]={7,17,6,84,56,1,34,10,100,0};
int b[11];
memmove(b+1,a,sizeof(a));
HeapSort(b,10);
memmove(a,b+1,sizeof(a));
for(int i=0;i<10;i++)
{
printf("%d\n",a[i]);
}
}