堆排序:
用数组模拟二叉树,先构建最小堆,在依次获取堆顶元素,并更新二叉树,从而完成排序
时间复杂度:O(NlogN) 其中构建二叉树O(N)
空间复杂度:O(N)
#include <stdio.h>
void pushDown(int *a, int p,int n){
int tmp = a[p];
int kid = p*2+1;//左子树root节点
while(kid < n){
if(kid+1 < n && a[kid+1] < a[kid] )//如果右子树比左子树小,则在右子树上操作
kid++;
if(a[kid] > tmp)//比左右子树的数都大
break;
a[p] = a[kid];
p = kid;
kid = kid*2+1;
}
a[p] = tmp;
}
void initMinHeap(int *a , int len){
int i;
for(i=len/2-1; i>=0; i--){
pushDown(a,i,len);
}
}
int delete(int *a , int n){
int tmp = a[0];
a[0] = a[n-1];
pushDown(a,0,n);
return tmp;
}
int main() {
int a[10] = {1,6,2,9,5,2,4,8,5,7};
initMinHeap(a,10);
int i=0;
for(i=10; i>=1; i--){
printf("%d\n", delete(a,i));
}
return 0;
}