#include <iostream>
#include <vector>
using namespace std;
// 维护以top为顶, 大小为size的堆
void heapify(vector<int>& arr, int top, int size) {
int largest = top;
int lson = top * 2 + 1;
int rson = top * 2 + 2;
if (lson < size && arr[largest] < arr[lson])
largest = lson;
if (rson < size && arr[largest] < arr[rson])
largest = rson;
// 此时larges指向三个数中最大的一个
if (largest != top) {
swap(arr[largest], arr[top]);
heapify(arr, largest, size);
}
}
// 堆排序入口
void heap_sort(vector<int>& arr) {
int len = arr.size();
// 建堆(自底向上维护堆)
// 之所以从len / 2 - 1开始,是因为其后的都不是堆顶
for (int i = len / 2 - 1; i >= 0; i--)
heapify(arr, i, len);
// 堆排序
for (int i = len - 1; i > 0; i--) {
// 将此刻的堆底与堆顶交换,再取出堆底
swap(arr[i], arr[0]);
// 维护堆顶,i之后的元素已排序不维护
heapify(arr, 0, i);
}
}
int main() {
vector<int> arr = {3,8,1,9,2,11,15,22,0,87};
for (int i : arr)
cout << i << " ";
cout << endl;
heap_sort(arr);
for (int i : arr)
cout << i << " ";
return 0;
}
C++ 实现堆排序
最新推荐文章于 2024-07-16 22:26:22 发布