选择排序 | 青训营笔记

243 阅读2分钟

今天介绍的是选择排序,算是比较容易理解的入门的排序算法了。

原理介绍

选择排序是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, 然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法描述

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

  1. 初始状态:无序区为R[1..n],有序区为空;
  2. 第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个的新无序区;
  3. n-1趟结束,数组有序化了。

选择排序的时间复杂度为O(n^2),这意味着对于一个长度为n的无序数组,选择排序需要进行n^2次遍历比较才能排序完成。因此,选择排序不是最优的算法,通常会选择更快的排序算法来解决问题。 在实际应用中,选择排序可能不是一种最优选择,但它是一种简单易懂的算法,适用于一些小规模的数据排序场景。

优化部分

双元选择优化

在遍历寻找最小值下标时,可以同时寻找最大值下标,这样就可以一轮遍历确定两个元素的位置,遍历次数减少一半,但每轮次的操作变多,因此该优化只能少量提升选择排序的速度 (复杂度介于单选择排序复杂度及其一半之间,只有系数上的区别)。

注意该优化并没有改变选择排序需要两层 for 循环的事实,所以其实时间复杂度仍然是 O(n^2)。