堆排序C++

#include<iostream>
using namespace std;

//headify初始化堆,堆化
//a为待排序的数列,i为当前节点(非叶子节点),n为待排序数列的长度
void heapify(int a[],int i,int n)
{
	int l = 2 * i + 1;//当前节点i的左孩子
	int r = 2 * i + 2;//当前节点i的右孩子
	int largest=i;//首先设置父子节点3个节点中最大值的位置为父节点的下标
	if (l<n && a[l] > a[largest])//l要小于n,否则是数组越界,当l节点的值大于i的值的时候,最大值节点的下标为l 
	{
		largest=l;
	}

	if (r<n && a[r] > a[largest])
	{
		largest=r;
	}

	if (largest!=i)//最大节点不是父节点,要进行交换
	{
		swap(a[i],a[largest]);
		//同时要递归保证子树还是最大堆
		heapify(a,largest,n);
	}
}
//堆排序的算法
void heapsort(int a[],int n)
{
	//建立最大堆,从最后一个非叶子节点开始(n/2-1),自下而上,
	for (int i=n/2-1 ; i>=0 ; i--)
	{
		heapify(a,i,n);
	}
	//调整,将根节点(大顶堆的根节点,也就是最大值)和待排序部分的最后一个节点(下标为 n-1)进行交换,自下而上
	for (int i=n-1; i>0 ;i--)
	{
		swap(a[0],a[i]);
		//待排序数组长度减1,对交换到堆顶的元素进行排序,重复直至排序结束
		heapify(a,0,i);
	}
}


int main()
{
	int b[]={99,89,10,32,6,5,2,8,465,33,7,7};
	int len=sizeof(b)/sizeof(b[0]);
	heapsort(b,len);
	for (int i=0;i<len;i++)
	{
		cout<<b[i]<<" ";
	}
	return 0;
}

参考:https://zhuanlan.zhihu.com/p/75894663
https://www.cnblogs.com/wanglei5205/p/8733524.html
https://www.jb51.net/article/86168.htm
https://jingyan.baidu.com/article/73c3ce284eed31e50343d9fd.html
https://www.cnblogs.com/chengxiao/p/6129630.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值