堆排序
- 实现思想
- 将无序序列建成一个堆,得到关键字最小(大)的记录;输出堆顶的最小(大)值后,将剩余的 n-1 个元素重又建成一个堆,则可得到 n 个元素的次小值;如此重复执行,直到堆中只有一个记录为止,每个记录出堆的顺序就是一个有序序列。
- 时间复杂度
- 最好情况:O(nlogn)
- 最坏情况:O(nlogn)
- 平均时间复杂度:O(nlogn)
- 空间复杂度
- 稳定性
代码
#include<stdio.h>
void HeapAdjust(int r[],int s,int m){
int j,tmp;
tmp=r[s];
for(j=2*s;j<=m;j*=2){
if(j<m&&r[j]<r[j+1])
j++;
if(tmp>r[j])
break;
r[s]=r[j];
s=j;
}
r[s]=tmp;
}
void HeapSort(int r[],int n){
int i,tmp;
for(i=n/2;i>=1;i--)
HeapAdjust(r,i,n);
for(i=n;i>1;i--){
tmp=r[1];
r[1]=r[i];
r[i]=tmp;
HeapAdjust(r,1,i-1);
}
}
void Output(int r[],int n){
int i;
for(i=1;i<=n;i++){
printf("%d ",r[i]);
}
printf("\n");
}
void main(){
int n=8;
int r[9]={0,3,1,7,5,2,4,9,6};
printf("未排序的集合为:\n");
Output(r,n);
HeapSort(r,n);
printf("从小到大排序后的集合为:\n");
Output(r,n);
}