堆排序
#include<stdio.h>
sift(int a[],int x,int n){
int i,j,finshed;
i=x; j=2*i; a[0]=a[i]; finshed=0;
while(j<=n&&(!finshed)){
if(j<n&&a[j+1]<a[j]) j++;
if(a[i]<=a[j]) finshed=1;//堆顶满足小根堆情况直接跳出循环
else{
a[i]=a[j];
i=j; j=2*j;
a[i]=a[0];当前根堆调整后,检查下属根堆是否还满足根堆条件,并进行调整;
}
}
}
Heapsort(int a[],int n){
int i;
for(i=n/2; i>=1; i--) sift(a,i,n);//用筛选算法建堆
for(i=n; i>1; i--){
a[0]=a[i];
a[i]=a[1];
a[1]=a[0];
sift(a,1,i-1);
}
}
Display(int a[],int n){
for(int i=n; i>=1; i--)
printf("%d ",a[i]);
}
int main(){
int i,n;
int a[100]={0};
printf("数组元素个数:");
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
Heapsort(a,n);
Display(a,n);
}
//312 126 272 226 28 165 123 8 12