1.什么是简单选择排序
简单选择排序,是一种简单直观的排序算法,能处理大部分数据。其基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]交换,…,第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次交换,得到一个按排序码从小到大排列的有序序列。
1.1 算法步骤
1. 获取序列中元素的个数,一般记为n;
2. 进行n-1次选择,即从0到n-2次选择,每次选择一个最小的数,并将这个数与数组中对应位置的值交换;
1.2 算法演示
下面给出一个简单选择排序的演示,便于理解以上的算法过程:
function selectionSort(&$arr){
$len=count($arr);
for($i=0;$i<$len-1;$i++){
$min=$i;//假设$i就是最小值的位置
for($j=$i+1;$j<$len;$j++){//让$i后面的数跟它对比
if($arr[$j]<$arr[$min]){
$min=$j;//更新最小数的位置
}
}
if($min !=$i){//如果最小数的位置发生改变就交换两个数的位置
$temp=$arr[$min];
$arr[$min]=$arr[$i];
$arr[$i]=$temp;
}
}
}
2. 算法分析
2.1 时间复杂度
因为要进行n次选择,每次在n-i+1(i=1,2,3…n-1)个数中选择一个最小值,
所以它的比较次数是$\sum_{i=1}^{n-1}(n-i)=\frac{n^2-n}{2}$次,移动记录的次数与序列的初始状态有关。
当序列正序时,移动记录0次;反序时,每个记录移动一次,移动次数为n-1次。因此,
总的时间复杂度为O(n^2)。由于它的常数很小,n值比较小或者文件已经按序排序时,该算法还是比较有效的。
2.2 空间复杂度
由于用到了一个临时变量,因此空间复杂度为O(1)。
2.3 算法稳定性
稳定排序算法的稳定性指的是,值相同的元素在排序后仍然保留着排序前的顺序。
简单选择排序是不稳定的算法,例如序列5 8 5 2 9,第一趟选择第一个元素2与第四个元素5交换,那么第一个5和第二个5的相对前后顺序就被破坏了。