堆排序:
* 大顶堆:根节点的值大于左右孩子的值,排序结果是 从小到大
* 小顶堆:根节点的值小于左右孩子的值,排序结果是 从大到小
注意:
堆是一个完全二叉树
【1】选择倒数第二排的节点 进行 堆的初始化: 大顶堆 or 小顶堆;
【2】完成初始化后,交换顶点与末尾节点;
【3】交换完后,进行 堆类型 的重构;
【4】重构 后,再交换顶点与末尾节点;
【5】再重构;
...
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int>ans;
void bigheap(vector<int>&nums, int start,int end) {
int parent = start;
int child = 2 * parent + 1;
while (child < end) {
//判断左右节点哪个大于父节点
if (child + 1 < end && nums[child + 1] > nums[child])
child++;
//扎到了大于父节点的子节点后,交换两个节点的值
if (nums[parent] < nums[child]) {
swap(nums[parent], nums[child]);
parent = child;//子节点的下标给父节点
}
//更新子节点
child = 2 * child + 1;
}
}
void heapSort(vector<int>&nums) {
int n = nums.size();
if (n <= 1)return;
//从倒数第二排开始创建大顶堆
for (int i = n / 2-1; i >= 0; i--)bigheap(nums, i,n);
for (int j = n - 1; j > 0;j--) {
//交换顶点和第 j 个数据
swap(nums[0], nums[j]);
//每交换一次重新建立大顶堆
bigheap(nums, 0,j);
}
}
int main() {
vector<int>nums(9);
for (int i = 0; i < 9; i++) {
cin >> nums[i];
}
heapSort(nums);
for (auto num : nums)
cout << num << " ";
return 0;
}