Algorithm第四版算法 C++实现(五)——堆排序

堆排序是一种基于优先队列的排序方式

class sort
{
public:
void heap_sort(std::vector<T> &a)   //n为数组长度
	 {
		 int n = a.size();
		 int i;
		 /*初始化堆*/
		 for (i = n / 2; i >= 0; i--)  //根据数学,2^n/2=2^(n-1),二叉树最底层的元素的量是上层元素的量+1 
			 percdown(a, i, n);
		 /*排序*/
		 for (i = n - 1; i >= 0; i--)
		 {
			 swap(a,0, i);          //将堆顶元素沉入堆底,并且将堆长度减1
			 percdown(a, 0, i);
		 }
	 }
private:
	void swap(std::vector<T> &a, int i, int j)
	{
		T temp;
		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	void percdown(std::vector<T> &a, int i, int n) //i是 本层第一个元素,n是本层最后一个元素 
	 {
		 int child;        //孩子结点
		 int temp;		  //临时变量
		 /*对堆进行整理*/
		 for (temp = a[i]; i * 2 + 1 < n; i = child)
		 {
			 child = i * 2 + 1; 								//当前结点的左孩子结点
			 if (child != n - 1 && a[child] < a[child + 1])  //比较左孩子和右孩子谁大
				 child++;
			 if (temp < a[child])
				 a[i] = a[child];//使a[i]是最小的 
			 else
				 break;
		 }
		 a[i] = temp;
	 }

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值