方法
- 先将数组构造为大顶堆或者小顶堆
- 将堆顶元素与最后一个元素(最后一个元素从数组最后一个元素往前推)交换,再将堆顶元素下沉,但最大下沉位置是最后一个元素的前一个。
- 得到排序后的数组,若构造的是大顶堆,则按递增排序;若构造的是小顶堆,则按递减排序。
code
#include <stdio.h>
#include <stdlib.h>
int swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
return 0;
}
int max_heapify(int *arr, int left, int right){
int idx = left;
int idx_l = idx * 2 + 1;
int idx_r = idx * 2 + 2;
int idx_max;
while(idx_l <= right){
idx_max = idx_l;
if(idx_r <= right && arr[idx_r] > arr[idx_max]){
idx_max = idx_r;
}
if(arr[idx] >= arr[idx_max]){
return 0;
}else{
swap(&arr[idx], &arr[idx_max]);
idx = idx_max;
idx_l = idx * 2 + 1;
idx_r = idx * 2 + 2;
}
}
return 0;
}
int heap_sort(int *arr, int size){
int i;
for(i = size/2 - 1; i > -1; i--){
max_heapify(arr, i, size-1);
}
for(i = size-1; i > 0; i--){
swap(&arr[0], &arr[i]);
max_heapify(arr, 0, i-1);
}
return 0;
}
int main(){
int arr[1024];
int i;
for(i = 0; i < 1024; i++){
arr[i] = random() % 1024;
}
heap_sort(arr, 1024 - 1);
int prev = arr[0];
for(i = 1; i < 1024; i++){
if(arr[i] < prev){
break;
}
}
if(i < 1024){
printf("error idx : %d\n", i);
}else{
printf("sorted\n");
}
exit(0);
}
测试
- 产生有 1024 个随机数的数组,进行排序,排序后检测数组是否有序。
![res](https://i-blog.csdnimg.cn/blog_migrate/55193144ff568d6ed6e455ba53efacf0.png#pic_center)