堆排序
原理
知乎堆构建图解
十大经典排序算法
代码
#include <iostream>
using namespace std;
void heapSort(int *arr, int size) {
//交换函数
auto swap = [](int &a, int &b) {
int t = a;
a = b;
b = t;
};
//左节点,(根节点为0)
auto left = [](int cur) {
return cur * 2 + 1;
};
//右节点
auto right = [](int cur) {
return cur * 2 + 2;
};
//自上往下调整
auto heapify = [left, right, swap](int *arr, int cur, int size) {
while (true) {
int l = left(cur), r = right(cur);
int maxId = cur;
if (l < size && arr[l] > arr[maxId])maxId = l;
if (r < size && arr[r] > arr[maxId])maxId = r;
if (maxId == cur)break;
else {
swap(arr[maxId], arr[cur]);
cur = maxId;
}
}
};
//建最大堆
auto buildMaxHeap = [heapify](int *arr, int size) {
for (int i = size / 2; i >= 0; i--) {
//自下往上,每个节点自上往下调整。
heapify(arr, i, size);
}
};
buildMaxHeap(arr, size);
//排序同时自根部往下调整最大堆
for (int i = 0; i < size - 1; i++) {
swap(arr[size - 1 - i], arr[0]);
heapify(arr, 0, size - 1 - i);
}
}
int main() {
int size;
cin >> size;
int *arr = new int[size];
for (int i = 0; i < size; i++)cin >> arr[i];
heapSort(arr, size);
for (int i = 0; i < size; i++)cout << arr[i] << " ";
delete[] arr;
/*
5
11 34 14 41 55
*/
return 0;
}