简单选择排序是一种尽量减少交换的一种排序方法。
一、在之前介绍的冒泡排序算法中,它的思想就是不断进行交换不断进行交换,而简单选择排序就是找准一个最小值之后在进行交换。举个生活中简单的例子,很多人喜欢炒股,有一些人喜欢快买快卖从中快速赚取差额,但有一些喜欢看准时机等待时机再进行买入跟买出,这跟冒泡排序跟简单选择排序的思路很像。
二、实现的原理
每一次进行比较,不进行交换而记录最小值下标。就交换一次就是将最小值交换过来。
通过i次循环找到每次循环中的最小值的下标,将i位置的值跟最小值进行替换。如i=1时,min=1,依次跟j进行比较,如果min对应的值大于j对应的值,则min跟j进行交换,依次循环比较下去,直到集合末尾。判断i跟min是否一致,一致的话代表min还是i的位置所以不需要替换,但是如果不一致,i跟min对应位置的值交换,这样的话i位置对应的值就是最小值。接下来i++,就可以以此类推的进行寻找最小值。
三、代码实现(PHP版本)
<?php
function EasySelect(&$array)
{
$length = count($array) - 1;
for ($i = 0; $i <= $length; $i++) {
$min = $i;
for ($j = $i + 1; $j <= $length; $j++) {
if ($array[$min] > $array[$j]) {
$min = $j;
}
}
if ($i != $min){
swap($array,$i,$min);
}
}
}
其他的swap就是简单的交换函数我就不写了。
四、时间复杂度分析(稳定排序)
最好的情况:基本全部有序,不需要进行0次交换。进行比较的次数为1+2+3+4+...n-1=n*(n-1)/2次;
最坏的情况:全部无需,需要n-1次交换,进行比较的次数也跟最好的情况一样;
排序的时间总和等于交换时间+比较时间,则时间复杂度为O(n²);