对于一个大顶堆来说,堆顶维护的是最大值,每次从堆顶弹出一个元素,放到堆末,然后堆长度减一,堆自动维护堆的性质,即向下调整。反复循环这样的操作,我们就得到了一个有序序列。这种思想就是堆排序的思想。
/*************************************************************************
> File Name: heapsort.c
> Author: jby
> Mail:
> Created Time: Wed 19 Jul 2023 01:29:40 PM CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define swap(a, b) { \
__typeof(a) __tmp = a; \
a = b; b = __tmp; \
}
void downAdj(int *arr, int idx, int len) {
while (idx * 2 + 1 < len) {
int tmp = idx, l = idx * 2 + 1, r = idx * 2 + 2;
if (arr[l] > arr[tmp]) tmp = l;
if (r < len && arr[r] > arr[tmp]) tmp = r;
if (tmp == idx) break;
swap(arr[idx], arr[tmp]);
idx = tmp;
}
return ;
}
void heap_sort(int *arr, int len) {
int i;
for (i = (len - 2) / 2; i >= 0; i--) {
downAdj(arr, i, len);
}
for (i = len - 1; i > 0; i--) {
swap(arr[0], arr[i]);
downAdj(arr, 0, i);
}
return ;
}
void showArr(int *arr, int len) {
printf("arr:[");
for (int i = 0; i < len; i++) {
i && printf(", ");
printf("%d", arr[i]);
}
printf("]\n");
}
int main () {
srand(time(0));
#define ARRLEN 10
int arr[ARRLEN];
for (int i = 0; i < ARRLEN; i++) {
arr[i] = rand() % 100;
}
showArr(arr, ARRLEN);
heap_sort(arr, ARRLEN);
showArr(arr, ARRLEN);
#undef ARRLEN
}