1.核心思想
把数组从第1项开始,假设第一个数为最小值,依次与后项对比,记下较小数的索引,遍历结束后得到最小项的索引,将首项与最小项对换。
从第2项开始,依次…
从第n-1项开始…
划重点!其实就是内外俩循环!
2.代码实现
先附上一个好用的在线Java编译工具:https://www.jdoodle.com/online-java-compiler/
//java
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
selectionAlgo();
}
public static void selectionAlgo(){
int[] array = {3,4,5,2,1};
System.out.println("排序前:"+Arrays.toString(array));
for(int i = 0 ; i < array.length-1; i++){
int minPosition = i;
for(int j = i; j < array.length; j++){
minPosition = array[minPosition] > array[j] ? j : minPosition;
}
changePosition(array, i, minPosition);
}
System.out.println("排序后:" + Arrays.toString(array));
}
public static void changePosition(int[] array, int small , int big){
int temp = array[big];
array[big] = array[small];
array[small] = temp;
}
}
附上数组的打印方式,我估计很多小伙伴都忘了怎么打印。
- 经典for循环方式
for(int i = 0 ; i < array.length ; i++){
System.out.println(array[i]);
}
- 高级foreach方式
for(int i : array){
System.out.println(array[i]);
}
- 调包侠
import java.util.Arrays;
System.out.println(Arrays.toString(array));
3.性能分析
时间复杂度:
从第1个开始遍历,两两对比,标记较小数的索引为minPosition,时间复杂度:n
从第2个数开始遍历,两两对比,标记较小数的索引为minPosition,时间复杂度:n-1
…
直到第n-1个数,时间复杂度:1
总的时间复杂度O = n+(n-1)+(n-2)+…+2+1=n*n - n(n - 1)/2(其实就是等差数列和公式) = n²/2 - n/2 ≈ n² , 即O(n²)。
空间复杂度:
由于选择排序过程中没有增加新数组或其他空间开销,因此空间复杂度为S(1)。
稳定性1 :
遇到相同的数,还是可能会交换,因此它是不稳定算法。
排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的;否则称为不稳定的。 ↩︎