首先,先来看看堆排序的优点,适合哪种数据排序:
1. 堆排序在最坏的情况下,其时间复杂度也能达到O(nlogn)。相对于快速排序来说,这是它最大的优点;
2 堆排序仅需要一个记录大小供交换用的辅助存储空间,空间复杂度O(1
#include<stdio.h>
#define n 10
/*构建堆*/
void buildHeap(int a[],int root,int len){
int temp,i,j;
temp = a[root];
for(i=root*2+1;i<len;i=i*2+1){
//判断是否有右节点,如果有,则比较子节点的大小
if(i<len-1&&a[i]<a[i+1]){
i++;
}
//比较父节点和子节点的大小
if(temp<a[i]){
a[root] = a[i];
root = i;
}else{
break;
}
}
a[root] = temp;
}
/*打印数组*/
void print(int a[],int len){
int i = 0;
for(;i<len;i++){
printf("%d\t",a[i]);
}
}
/*堆排序*/
void orderHeap(int a[],int len){
int i,j,temp;
for(i=len/2-1;i>=0;i--){
buildHeap(a,i,len);
}
for(i=1;i<n;i++){
temp = a[0];
a[0] = a[n-i];
a[n-i] = temp;
buildHeap(a,0,n-i);
}
}
int main(){
int a[n]={3,5,23,78,34,1,7,9,3,10};
printf("堆排序之前\n");
print(a,n);
orderHeap(a,n);
printf("\n堆排序结果\n");
print(a,n);
return 0;
}
);