#include<iostream>
#include<vector>
using namespace std;
//i代表当前节点,n代表总的数量,这里是在不断的交换
//这里最终建立的是小根堆,最小值往上冒
void change_smallest(vector<int> &nums,int len,int i)
{
int smallest = i;
int left = 2 * i + 1;//注意这里的序号是从0开始的
int right = 2 * i + 2;
if (left<len&&nums[left] < nums[smallest])
smallest = left;
if (right<len&&nums[right] < nums[smallest])
smallest = right;
if (smallest != i)
{
swap(nums[smallest], nums[i]);
i = smallest;
change_smallest(nums, len,i);//采用递归的形式依次进行排序
}
}
void heap_sort(vector<int> &nums)
{
int len = nums.size();
for (int i = len / 2 - 1; i >= 0; i--)
{
change_smallest(nums,len, i);
}
for (int i = len - 1; i >= 0; i--)
{
swap(nums[i], nums[0]);//这一步是完成根顶元素和最末端的元素的交换,交换完之后,继续进行堆排序,使数组最后面的值都是当前最小值
change_smallest(nums, i,0);//这里其实是把最小值和最后一位进行交换,并且不考虑交换后的元素,此时整
堆排序(C++实现,非常简洁明了)
最新推荐文章于 2021-12-13 21:07:37 发布
本文详细介绍了堆排序的概念,以及如何使用C++实现这一排序算法。通过具体代码示例,展示了堆排序的过程,包括建立最大堆、交换根节点与末尾元素以及调整堆的过程。读者将能理解堆排序的工作原理,并学会应用C++进行实现。
摘要由CSDN通过智能技术生成