#include <iostream>
using namespace std;
void downUpdate(int *arr, int n, int ind) {
while ((ind << 1) <= n) {
int temp = ind, l = temp << 1, r = temp << 1 | 1;
if (arr[temp] > arr[l]) temp = l;
if (r <= n && arr[temp] > arr[r]) temp = r;
if (temp == ind) break;
swap(arr[temp], arr[ind]);
ind = temp;
}
return;
}
void heap_sort(int* arr, int n) {
arr -= 1;
//建堆
for (int i = n >> 1; i >= 1; i--) {
downUpdate(arr, n, i);
}
//堆排序
for (int i = n; i > 1; i--) {
swap(arr[i], arr[1]);
downUpdate(arr, i- 1, 1);
}
return;
}
void output(int* arr, int n) {
printf("[");
for (int i = 0; i < n; i++) {
i&& printf(" ");
printf("%d", arr[i]);
}
printf("]\n");
return;
}
int main() {
srand(time(0));
#define MAX_N 20
int arr[MAX_N] = {
0 };
for (int i = 0; i < MAX_N; i++) {
arr[i] = rand() % 100;
}
output(arr, MAX_N);
heap_sort(arr, MAX_N);
output(arr, MAX_N);
#undef MAX_N
return 0;
}
线性建堆法
猜你喜欢
转载自blog.csdn.net/qq_40713201/article/details/125364719
今日推荐
周排行