排序(七): 堆排序 - Heap_Sort

堆排序

听到这个就又开始头痛了。堆排序,顾名思义,用堆进行的排序。
但实际上,只要知道了具体的做法,堆排序并不难。
堆排序的困难在于建立最大堆(这里用最大堆为例)

直接上图
5比自己的子节点要小,故要移位
在这里插入图片描述
又发现5还是比字节点要小,所以接着换
在这里插入图片描述
在这里插入图片描述

像这样逐步得到最大堆

最大堆设置完毕,就要开始进行堆排序。
1. 将堆的顶部,与最后一个元素交换。
2. 再将剩下的元素进行上述操作,调整为最大堆。
3. 调整完毕,继续将最大元素与最后一个元素交换。
4. 如此类推,直至排序完成

在这里插入图片描述
上代码

#include <iostream>
using namespace std;

void cmp_Heap(int* a, int node, int size)
{
	int left = 2 * node + 1;         //左子树
	int right = 2 * node + 2;        //右子树
	int max = node;
	if (left<size && a[left]>a[max])
		max = left;
	if (right<size && a[right]>a[max])
		max = right;
	if (max != node)
	{
		swap(a[max], a[node]);
		cmp_Heap(a, max, size);
	}
}

void Heap_Sort(int* a, int len)
{
	for (int i = len / 2 - 1; i >= 0; --i)
		cmp_Heap(a, i, len);

	for (int i = len - 1; i >= 0; i--)
	{
		swap(a[0], a[i]);           // 将当前最大的放到数组最后
		cmp_Heap(a, 0, i);          // 将未排序的部分进行堆排序
	}

}

int main()
{
	int data[10] = { 1,23,89,-65,-88,0,54,85,300,-100 };
	int len = sizeof(data) / sizeof(int);
	cout << "排序前" << endl;
	for (int i = 0; i < len; i++)
		cout << data[i] << " ";
	cout << endl;
	Heap_Sort(data, len);
	cout << "堆排序后:" << endl;
	for (int i = 0; i < len; i++)
		cout << data[i] << " ";

	return 0;

}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值