堆排序(C++实现,非常简洁明了)

本文详细介绍了堆排序的概念,以及如何使用C++实现这一排序算法。通过具体代码示例,展示了堆排序的过程,包括建立最大堆、交换根节点与末尾元素以及调整堆的过程。读者将能理解堆排序的工作原理,并学会应用C++进行实现。
摘要由CSDN通过智能技术生成
#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);//这里其实是把最小值和最后一位进行交换,并且不考虑交换后的元素,此时整
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值