选择排序算法流程图_程序员必须要会的选择排序算法

算法主要衡量标准

时间复杂度(运行时间)

在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算法,主要会以访问数组的次数的维度做对比。

其实有很多同学对于算法的时间复杂度有点模糊,分不清什么所谓的 O(n),O(nlogn),O(logn)...等,也许下图对一些人有一些更直观的认识。

6e0008e4d37ca0da19aea45c3592852b.png

空间复杂度(额外的内存使用)

排序算法的额外内存开销和运行时间同等重要。 就算一个算法时间复杂度比较优秀,空间复杂度非常差,使用的额外内存非常大,菜菜认为它也算不上一个优秀的算法。

结果的正确性

这个指标是菜菜自己加上的,我始终认为一个优秀的算法最终得到的结果必须是正确的。就算一个算法拥有非常优秀的时间和空间复杂度,但是结果不正确,又有什么意义呢?

原理

在起始位置右侧(或左侧)找出最小的那个元素,然后和起始位置的元素交换。

选择排序是一个不稳定的排序算法。

具体步骤如下

1. 在一个数据列表中找到最小的那个元素,将它和列表的第一个元素交换位置。

2. 在第二个元素位置开始再次寻找最小的那个元素,然后和列表的第二个位置的元素交换。

3. 在第三个元素位置开始再次寻找最小的那个元素,然后和列表的第三个位置的元素交换

4. 如此反复,直到开始查找起始位置到达列表末尾。

如果查找过程中最小的元素就是起止位置的元素,那么它就和它自己交换。

因为这种算法总是在不断的选择剩余元素中最小者,因此得名选择排序

75de9db76409a3e49a74b25d8e9f6401.png

复杂度

时间复杂度

1. 比较次数

对于长度为N的列表,选择排序需要大约n² /2次比较.即:O(n²)平方级别。

2. 交换次数

对于长度为N的列表,选择排序需要大约N次交换.即:O(N) 线性级别。

性能和特点

总体来说,选择排序是一种比较简单的排序算法,很容易理解也很好用代码实现,当然他的特点也很明显:

运行时间和数据初始状态无关

为什么这么说呢?算法进行中为了查找最小的元素而遍历列表并不能为下次遍历带来任何信息,这个特性在大部分情况下是缺点。如果一个数据列表初始状态是有序的或者部分有序的,选择排序仍然需要全部扫描一次和交换。因此和一个完全无序的列表排序所花的时间相差不大。

数据移动次数是最少的

每次交换只会改变两个列表元素,因此长度为N的列表只会发生N次交换,交换次数和列表的长度是线性关系,其他算法都不具备这个特性。

适用场景

由于选择排序的对比次数在平方级别,但是移动次数在线性级别,所以当N比较小的时候比较适用。

其他

为什么选择排序不稳定呢?

首先我们要明白算法稳定是什么意思呢?

在待排序的数据中,存在多个相同的数据,经过排序之后,他们的相对顺序依旧保持不变,实际上就是说array[i]=array[j],i

根据以上定义很容易可以得出这样的结论:

我们举出一个实例,序列5 8 5 2 9, 这个在执行选择排序的时候,第一遍,肯定会将array[0]=5,交换到2所在的位置,也就是 2 8 5 5 9,那么很显然,之后的排序我们就会发现,array[2]中的5会出现在原先的array[0]之前,所以选择排序不是一个稳定的排序

实现案例

 static void Main(string[] args) { List data = new List() ; for (int i = 0; i < 10; i++) {  data.Add(new Random(Guid.NewGuid().GetHashCode()).Next(1, 100)); } //打印原始数组值 Console.WriteLine($"原始数据: {string.Join(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值