今天介绍的是选择排序,算是比较容易理解的入门的排序算法了。
原理介绍
选择排序是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, 然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
算法描述
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
- 初始状态:无序区为R[1..n],有序区为空;
- 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。
选择排序的时间复杂度为O(n^2),这意味着对于一个长度为n的无序数组,选择排序需要进行n^2次遍历比较才能排序完成。因此,选择排序不是最优的算法,通常会选择更快的排序算法来解决问题。 在实际应用中,选择排序可能不是一种最优选择,但它是一种简单易懂的算法,适用于一些小规模的数据排序场景。
优化部分
双元选择优化
在遍历寻找最小值下标时,可以同时寻找最大值下标,这样就可以一轮遍历确定两个元素的位置,遍历次数减少一半,但每轮次的操作变多,因此该优化只能少量提升选择排序的速度 (复杂度介于单选择排序复杂度及其一半之间,只有系数上的区别)。
注意该优化并没有改变选择排序需要两层 for 循环的事实,所以其实时间复杂度仍然是 O(n^2)。