堆排序:
1.构建最大堆。
2.取出当前堆顶(即待排序数组中最大的元素)
3.将取出后的堆重新调整为标准最大堆。(由于原堆只改变了堆顶,只对堆顶进行下放即可恢复最大堆,需注意由于取出元素,堆的大小变小)
4.重复2、3,直到所有数被取出。
void adjust_heap(int arr[],int now,int siz)
{
int left=now*2+1;
int right=now*2+2;
int ma=now;
//判断左右子节点是否有更大的
if(arr[ma]<arr[left] && left<siz){
ma=left;
}
if(arr[ma]<arr[right] && right<siz){
ma=right;
}
//如果子节点有更大的,则下放,继续判断子节点
if(ma!=now){
swap(arr[now],arr[ma]);
adjust_heap(arr,ma,siz);
}
}
void heap_sort(int arr[],int n)
{
//构建最大堆
for(int i=n/2-1;i>=0;i--){
adjust_heap(arr,i,n);
}
//堆排序,每次取最大堆堆顶
for(int i=n-1;i>=0;i--){
swap(arr[0],arr[i]);
adjust_heap(arr,0,i);
}
}