堆排序

堆排序

堆有两种分类,一种是大根堆,一种是小根堆;

大根堆

  1. 父亲节点的值均大于孩子结点的值
  2. 构建的这个堆必须是满二叉树

小根堆

  1. 父亲结点的值均小于孩子节点的值
  2. 构建的堆必须是满二叉树

思想:我们首先必须构建出堆;把数字先像二叉树一样排列好,如下:

接下来我们需要调整成为大根堆,从0号位置开始和它的子节点c1和c2比较,和它们中最大的换,接续和下面的孩子比较,如果比孩子小,继续换,我们这样就可以构建出最大堆。

构建出堆之后,我们把跟结点的和最后一个交换,输出最后一个,继续调整剩下的堆,然后继续把根节点和最后一个交换,直到输出完

代码如下:

void heap(int *arr, int n,int i) //父节点和子节点交换
{
	if (i >= n)
	{
		return;
	}
	int c1 = i * 2 + 1;
	int c2 = i * 2 + 2;
	int max = i;
	if (c1 < n && arr[c1] > arr[max])
	{
		max = c1;
	}
	if (c2 < n && arr[c2] > arr[max])
	{
		max = c2;
	}
	if (max != i)
	{
		swap(arr[max], arr[i]);
		heap(arr, n, max);
	}
}

void buildheap(int *arr, int n)  //从第一个不是叶子几点调整堆,使其变为大根堆/小根堆
{
	int last_node = n - 1;
	int i = (last_node - 1) / 2;
	for (; i >= 0; i--)
	{
		heap(arr, n, i);
	}
}

void heapsort(int *arr, int n)   //根结点和最后一个交换,将剩下的继续调整
{
	buildheap(arr, n);
	for (int i = n - 1; i >= 0; i--)
	{
		swap(arr[i], arr[0]);
		heap(arr, i,0);
	}
}

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值