选择排序&堆排序(C语言)

一、思路

下面这张图是朴素的选择排序想法,向后依次遍历,选取最小的排到前面以及排好序的数据之后。

我们还有一种想法,就是设置一个mini和一个maxi用来记录未排序序列中的最小值和最大值,然后分别将其排到前面和后面,下面是代码实现。

二、代码实现

// 选择排序
// 时间复杂度:O(N^2)
// 最好的情况下:O(N^2)
void SelectSort(int* a, int n){   //两头开始跑
	int begin = 0, end = n - 1;
	while (begin < end){
		int mini = begin, maxi = begin;
		for (int i = begin + 1; i <= end; ++i){
			if (a[i] < a[mini]){
				mini = i;
			}
			if (a[i] > a[maxi]){
				maxi = i;
			}
		}
		Swap(&a[begin], &a[mini]);
		if (maxi == begin){
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}

三、总结

选择排序是不稳定的排序,如何判断稳不稳定,就看相同的元素在排序前后能否保证相同的相对位置

堆排序在之前的博客中以及实现,并且充分分析了时间复杂度,有兴趣大家可以去看看

堆排序/top-k问题/建堆时间复杂度(C语言)-CSDN博客

选择排序也是非常经典且基础的排序算法,大家需要好好掌握

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值