思路
第 i 轮从第 i 个数后面选择一个最小的数与第 i 个数交换。需要 n - 1轮,第 i 轮比较 n - i -1 次。
代码
public class SelectionSort{
public static void selectionSort(int[] arr){
for(int i = 0; i < arr.length - 1; i++){
int minIndex = i;
for (int j = i+1; j < arr.length; j++){
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
}
}
public static void main (String[] args){
int[] array = new int[]{5,8,6,3,9,2,1,4,7};
selectionSort(array);
System.out.println(Arrays.toString(array));
}
}
复杂度分析
时间复杂度
双重循环,平均 O(n2)
最好最坏的情况也是 O(n2),因为无论如何,每轮都要找到最大值与最小值。
空间复杂度
额外空间与数组长度无关
O(1)
稳定性分析
涉及大范围内交换,不稳定
优势
相对冒泡排序,节省了大量交换的时间,每轮只用交换一次。
适用场景
无需稳定性、数据量小
18万+

被折叠的 条评论
为什么被折叠?



