堆排序
堆排序的时间复杂度O(logn)
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
void AdjustDowm(int* arr, int size, int cur) {
int n;
while(2 * cur + 1 < size) {
if (2 * cur + 2 >= size) {
n = 2 * cur + 1;
}
else {
if (arr[2 * cur + 1] > arr[2 * cur + 2]) {
n = 2 * cur + 1;
}
else {
n = 2 * cur + 2;
}
}
if (arr[n] > arr[cur]) {
int tmp = arr[n];
arr[n] = arr[cur];
arr[cur] = tmp;
cur = n;
}
else {
break;
}
}
}
void SwapHeap(int* arr, int size) {
if (size == 0) {
return;
}
int tmp = arr[0];
arr[0] = arr[size - 1];
arr[size - 1] = tmp;
AdjustDowm(arr, size - 1, 0);
}
void HeapSort(int* src, int cur) {
for (int i = cur / 2 - 1; i >= 0; i--) {
AdjustDowm(src, cur, i);
}
for (; cur > 1; cur--) {
SwapHeap(src, cur);
}
}
void PrintHeap(int* arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[SIZE];
printf("请输入一组数据:\n");
for (int i = 0; i < SIZE; i++) {
scanf("%d", &arr[i]);
}
HeapSort(arr, SIZE);
printf("堆排序的结果如下:\n");
PrintHeap(arr, SIZE);
system("pause");
return 0;
}
输出样例