一分钟算法——选择排序

Posted 无忧公主的数学时间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一分钟算法——选择排序相关的知识,希望对你有一定的参考价值。

选择排序



选择排序是几乎每一个程序员必备的“技能”,并没有比插入排序难多少,而且并不需要额外的存储空间,代码也不长,它和插入排序的核心思想有些类似。


先假设这一串数是:1,4,3,7,2,5,并进行从大到小的排序工作。第一次把最大的推到第一个位置:比较1和4,发现4更大,因此将1和4交换;比较4和3,发现4更大,不做任何处理;比较4和7,发现7更大,因此将4和7交换……之后的两次比较不再枚举了,最终第一次交换结束时,这串数变成:7,1,3,4,2,5。总结一下,就是每次将第一个位置的数和目前扫描到的数进行比较,如果第一个数较小,则和后面的这个数交换,所以最后第一个位置的数一定是最大的。那么第二次就是把不考虑第一个数了,比较完了,第二个位置的数一定是后面最大的(所有的当中第二大的)。之后一直都是这样的,也就是说,第i次操作完毕,第i个位置的数是第i大的,因此每次前i-1位是排好序的。


下面是一张选择排序的示意图,只是是从小到大排的,每次将数放在最末。





那么选择排序的复杂度是多少呢?空间的就不说了,无需更多的,只在原来的数组上面交换着进行。来看看时间复杂度,设有n个数。第一次将最大的推至第一位,需要(比较和交换)O(n-1);第二次是从第2个数开始的,需要一直扫描至第n个数,所以是O(n-2);第三次是O(n-3)……最后一次一定是0次,因为已经固定了。那么总共有O(n*(n-1)/2),简化得O(n^2),必要时也可写上/2。



选择排序和插入排序究竟有什么区别呢?别看复杂度一样,但是插入排序和读入(初始)的数据有关,最优情况只有O(n);而选择排序不论如何,永远都是O(n^2),那么有时不必改动过多就能满足条件的数据在选择排序下就会比较吃力。另一大问题就是,插入排序是可以边读边排的,每当我读入一个新的数时,我目前的数组一定是排好序的。而选择排序不同,它必须是读完所有的数据之后才能开始排序的。那么选择排序的缺点就是,万一数据量很大,比方说一百万个,光读就慢了,还要排序,那就更慢了。如果这两个耗时的步骤可以并行一起做的话,显然插入排序肯定就会快一些。


如果想了解插入排序,请参考我的前一篇文章。




以上是关于一分钟算法——选择排序的主要内容,如果未能解决你的问题,请参考以下文章

五分钟理解选择排序算法

三分钟彻底理解选择排序

三分钟快速记住 选择排序算法!

一分钟算法——冒泡排序

排序算法选择排序

面试官:冒泡插入选择这三种常见的排序算法你了解?为什么插入排序更受欢迎?