最大堆实现堆排序

堆排序(这里使用的是最大堆)
思想:1、将当前的堆转换成最大堆(从最大的非叶子结点开始,(1)判断根结点和左右结点的大小交换相互的位置,
使得该子树成为最大堆,每次交换成功后就继续往该结点的子结点去重复(1)操作,直到根结点后再去下一个非叶子结点,直到根结点)
2、转成最大堆后,每次就将第一个结点互最后一个结点进行交换,然后将整个堆的长度减去1
(因为最后一个结点就是整个数组中最大的元素,即就是已经排序好的结点)

3、重复1、2的操作,直到堆中的元素都排序好了

代码如下:

#include <iostream>
using namespace std;
int data[] = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };//测试示例
void ChangeMaxHead(int len)
{
	//len/2代表最大的非叶子结点
	for (int i = len / 2; i >= 1; i--){
		int temp = i;
		int maxIndex = temp;
		while (true)
		{
			int LeftIndex = 2 * temp;
			int RightIndex = 2 * temp + 1;
			if (LeftIndex > len) break;//左结点不存在,意味着该结点是叶子结点
			if (LeftIndex <= len && data[LeftIndex - 1] > data[maxIndex - 1]){//左结点存在并且值大于根结点
				maxIndex = LeftIndex;
			}
			if (RightIndex <= len && data[RightIndex - 1] > data[maxIndex - 1]){//右结点存在并且值大于根结点
				maxIndex = RightIndex;
			}
			if (maxIndex != temp){//交换两个结点
				int swapV = data[temp - 1];
				data[temp - 1] = data[maxIndex - 1];
				data[maxIndex - 1] = swapV;
				temp = maxIndex;
			}
			else break;
		}

	}
}
void Head_Sort(int len)
{
	ChangeMaxHead(len);
	for (int i = len - 1; i > 0; i--)
	{
		int temp = data[0];
		data[0] = data[i];
		data[i] = temp;
		ChangeMaxHead(i);
	}
}

int main()
{
	Head_Sort(9);
	for (int i = 0; i < 9; i++)
	{
		printf("%d ", data[i]);
	}
	puts("");
	return 0;
}
//输出  10 20 30 40 50 60 70 80 90


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值