[]( ̄▽ ̄)* giao起来。
1.堆排序
升序 需要转换成大根堆
arr[i]>arr[2*i+1] && arr[i]>arr[2*i+2]
降序 需要用转换成小根堆
arr[i]<arr[2*i+1] && arr[i]<arr[2*i+2]
143 void reheap(int arr[],int index,int n){ //对arr[index]及其子结点 转换成大根堆的形式
144 int child = 2*index+1;
145 int key = arr[index];
146 while(child<n){ //child结点存在
147 if(child+1<n && arr[child] < arr[child+1]){ //右孩子存在且大于左孩子,其目的就是找一个最大值的下标赋给index
148 ++child;
149 }
150 if(key<arr[child]){ //把child作为index继续向下判断
151 arr[index]=arr[child];
152 index=child; //把child作为父结点index
153 child = 2*index+1; //继续找孩子中的最大值
154 }else{
155 break;
156 }
157 }
158 arr[index]=key; //这个不能忘了,相当于交换了
159 }
160
161 void heap_sort(int arr[],int n){
162 int i;
163 for(i=n/2;i>=0;--i){ //i为第一个非叶子结点
164 reheap(arr,i,n);
165 } //到这里已经是一个大根堆的形式了
166 for(i=0;i<n-1;i++){ //每次去掉一个末尾的最大值,即把根节点与最后一个叶结点交换,
167 int mid = arr[0];
168 arr[0] = arr[n-i-1];
169 arr[n-i-1] = mid;
170 reheap(arr,0,n-1-i); //把第二大的结点作为根节点。
171 }
172 }
https://www.cs.usfca.edu/~galles/visualization/HeapSort.html
上面有具体步骤。