排序(二)选择排序与堆排序(C语言实现)

本文介绍了两种基本排序算法:选择排序和堆排序。选择排序通过不断找到数组中的最小(或最大)值并交换,逐步构建有序序列。堆排序利用大堆或小堆的性质,通过交换根节点与末尾节点并调整堆,实现排序。这两种算法在不同的场景下有不同的效率表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、选择排序

2、堆排序


1、选择排序

选择排序的思想其实就是选出数组中最小与最大的值分别放到数组的开头与结尾,然后选出次小的和次大的排在数组第二位和倒数第二位···直到排完。

 其中,有一种特殊情况:

 这个时候max在i = 1的位置没有变化,而min需要和这个位置的值进行交换,那么此时max所对应的值就到了min所在的位置,所以为了防止排序出错,此时需要更新max到min的位置。

 

void SelectSort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	int min = begin;
	int max = begin;
	while (begin < end)
	{
		min = begin;
		max = begin;
		for (int i = begin; i <= end; i++)
		{
			if (a[i] < a[min])
				min = i;
			if (a[i] > a[max])
				max = i;
		}
		swap(&a[begin], &a[min]);

		if (max == begin)
			max = min;
		swap(&a[end], &a[max]);
		begin++;
		end--;
	}
}

2、堆排序

堆排序的原理是在大堆或小堆的基础上将根节点与最后一个节点交换,然后进行向下调整,因为大堆或小堆的根节点是整个堆中最大或最小的值,所以一直取堆顶元素最终会达到有序。

void AdjustDown(hpDataType* a, int n, int parent) //向下调整
{
	int child = parent * 2 + 1; //默认孩子是左孩子
	while (child < n)
	{
		//选出左右孩子中最大的一个
		if (child + 1 < n && a[child] < a[child + 1]) //注意越界,child+1如果等与n就越界
		{
			child = child + 1;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSort(int* a, int n)
{
	//排升序,建大堆
	//向上调整方法
	/*for (int i = 1; i < n; ++i)
	{
		AdjustUp(a, i);
	}*/
	//向下调整方法
	for (int i = (n - 2) / 2; i > 0; i--)
	{
		AdjustDown(a, n, i);
	}
	while (n > 0)
	{
		Swap(&a[0],&a[n-1]);
		n--;
		AdjustDown(a, n, 0);
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双葉Souyou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值