选择排序也是一种比较简单的排序方式,其原理是在给定的一系列值中,首先找出最小的值放在第一位,然后在剩下的值中找出最小的值放在第二位,以此类推,直到剩下的值只有一个的时候,则完成了排序。
下面看一个例子,假设给定一组数字3,2,8,2,4,9,1
首先是第一轮,假设第一个数字3为最小值,记录下它的位置
然后从第二个数字2开始往后遍历
因为2比3小,所以更新最小值的位置为2的位置,然后往后遍历
因为2比8小,所以不用更新最小值的位置,继续往后遍历
因为2不比2大,所以不用更新最小值的位置,继续往后遍历
因为2比4小,所以不用更新最小值的位置,继续往后遍历
因为2比9小,所以不用更新最小值的位置,继续往后遍历
因为2比1大,所以更新最小值的位置为1的位置
这个时候遍历到头了,然后将最小值的位置和这一系列值的第一个交换位置
这个时候第一轮结束了,第一个位置就是找到的最小值
接下来开始第二轮的比较,第二轮假定第二个数字2为最小值
然后从第三个数字8开始遍历
因为2比8小,所以不用更新最小值的位置,继续遍历
因为2不比2小,所以不用更新最小值的位置,继续遍历
因为2小于4,所以不用更新最小值的位置,继续遍历
因为2小于9,所以不用更新最小值的位置,继续遍历
因为2小于3,所以不用更新最小值的位置,这时候遍历到头了,所以这一轮最小值就是2
接下来开始第三轮,第三轮首先假设第三个数字8为最小值
从8后面的2开始遍历
因为2比8小,所以更新最小值的位置为2的位置,继续往后遍历
因为2比4小,所以不用更新最小值的位置,继续遍历
因为2比9小,所以不用更新最小值的位置,继续遍历
因为2比3小,所以不用更新最小值的位置,这时候遍历到头了,找到了第三大数字,第三轮结束
然后开始第四轮,第四轮假设第四个数字8为最小值
从第五个数字4开始遍历
因为4比8小,所以更新最小值的位置为4的位置,继续遍历
因为4比9小,所以不需要更新最小值的位置,继续遍历
因为3比4小,所以需要更新最小值的位置为3的位置
这一轮遍历结束,交换数字3和数字8的位置,这样前4个数字就排好序了
接下来开始第五轮,首先假定第五个数字4为最小值的位置
从第六个数字9开始往后遍历
因为4比9小,所以不需要更新最小值的位置,继续遍历
因为4比8小,所以不需要更新最小值的位置,遍历到头了,所以数字4是这一轮最小值
然后开始最后一轮处理,假定第六个数字9为最小值所在的位置
从第七个数字8开始遍历
因为8比9小,所以需要更新最小值的位置为8的位置,遍历到头了
将8的位置和数字9的位置交换
数字9后面没有值了,所以无需再遍历比较了,所有的数字已经排好序了,整个排序过程结束。
那么,选择排序是不是稳定的呢?
答案是不是的,举个例子
对于上面这一组数字,第一轮结束的时候,第一个数字2和最后一个数字1会交换位置,那么就会导致原始数字中两个2的顺序和排序后两个2的顺序不一样,所以选择排序是不稳定的。
总结
- 选择排序的最坏的时间复杂度为O(N^2),空间复杂度为O(1)
- 选择排序是不稳定的,在排序的过程中,有可能改变原有的相同值的顺序