堆排序

堆排序

是一种不稳定的方法,时间复杂度为 O(nlog2 N)。

基本思想:

​ 首先将待排序的记录序列构造成一个堆,此时,选出了对重所有记录的最大者即堆顶记录。然后将堆顶记录移走,并将剩余的记录在调整成堆,这样又找出了次大的记录。一次类推,直到堆中只有一个记录为止。

代码:
void Sift(int r[],int k,int m)//筛选法调整堆的算法
{
	int i = k;
	int j = 2 * i;
	while (j <= m)
	{
		if (j < m && r[j] < r[j + 1])
		{
			j++;
		}
		if (r[i] < r[j])
		{
			break;
		} 
		else
		{
			int nTemp = r[i];
			r[i] = r[j];
			r[j] = nTemp;
			i = j;
			j = 2 * i;
		}
	}
}

void HeapSort(int r[],int n)
{
	int i;
	for (i = n / 2; i >= 1; i--)
	{
		Sift(r, i, n);
	}
	for (i = 1; i < n;i++)
	{
		int nTemp = r[1];
		r[1] = r[n - i + 1];
		r[n - i + 1] = r[1];
		Sift(r, 1, n - 1);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值