排序算法---选择排序&堆排序&冒泡排序

本文介绍了三种基本排序算法:直接选择排序、堆排序和冒泡排序。直接选择排序在最好情况下时间复杂度为O(n),最坏为O(n^2);堆排序的时间复杂度为O(n*logN);冒泡排序在最好和最坏情况下都是O(n^2)。通过对三种排序算法的理解,可以更好地比较和选择适合不同场景的排序方法。
摘要由CSDN通过智能技术生成

直接选择排序和堆排序都属于选择排序

ps:仍以升序为例!

一、直接选择排序

直接选择排序的思想:

选择排序就是通过n-i次关键字的比较,每次从n-i+1个记录中找出最小的关键字,将其与第i个位置的数据交换。


void SelectSort(int* a, size_t size)
{
	assert(a);

	int max = 0;
	for (size_t i=0; i<size; ++i)
	{
		max = i;
		for (size_t j=i+1; j<size; ++j)
		{
			if (a[j] > a[max])
			{
				max = j;
			}
		}
		if (i != max)
			swap(a[i],a[max]);
	}
}

直接选择排序的优化:

上边简单的选择排序是每次选出一个数来交换,优化后的做法是从数组的两边开始遍历,每次选出一个最大的数一个最小的数来进行交换

void SelectSort(int* a,int size)
{
	assert(a);

	int left = 0;
	int right = size-1;
	while(left < right)
	{
		int min = left;
		int max = left;
		//在[left,right]区间内找最大最小
		for (int i=left; i<=right; ++i)
		{
			if (a[i] < a[min])
				min = i;		//找到[left,right]内最小值的下标
			if (a[i] > a[max])
				max = i;		//找到[left,right]内最大值的下标
		}
		swap(a[left],a[min]);	//将最小值放在区间最左边
		if (left &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值