#include<iostream>#include<vector>#include<algorithm>
using namespace std;//在start 和end区间内,如果父节点小于子节点,就交换voidmax_heapify(int arr[],int start,int end){//建立父节点指标和子节点指标int dad = start;int son = dad *2+1;//左子节点while(son <= end)//若子节点指标在范围内才做比较{if(son +1<= end && arr[son]< arr[son +1])//先比较两个子节点大小,选择最大的
son++;if(arr[dad]> arr[son])//如果父节点大于子节点代表调整完毕,直接跳出函数return;else//否则交换父子内容再继续子节点和孙节点比较{swap(arr[dad], arr[son]);
dad = son;
son = dad *2+1;}}}voidheap_sort(int arr[],int len){//初始化,i从最后一个父节点开始调整//堆数组的前一半为父节点,后一半为子节点for(int i = len /2-1; i >=0; i--)max_heapify(arr, i, len -1);//先将第一个元素和已经排好的元素前一位做交换,再从新调整(刚调整的元素之前的元素),直到排序完毕for(int i = len -1; i >0; i--){swap(arr[0], arr[i]);max_heapify(arr,0, i -1);}}intmain(void){int arr[]={3,5,3,0,8,6,1,5,8,6,2,4,9,4,7,0,1,8,9,7,3,1,2,5,9,7,4,0,2,6};int len =(int)sizeof(arr)/sizeof(*arr);heap_sort(arr, len);for(int i =0; i < len; i++)
cout << arr[i]<<' ';
cout << endl;return0;}