思想
每次選擇未排序元素中的最小值,將其放在最左邊。
想象你打牌的時候,如果你手上有一堆牌,你每次找到最小的牌,然後將其出出來。手上的是未排序的牌,出出去的牌按順序擺出來,就是已排序的。
比較耗時:第一次比較n,第二次比較n-1,以此類推
插入耗時:插入策略分爲,移動選定元素前的元素,然後插入最小值;或者不斷交換相鄰元素,直到最小值到達所在位置;或者找到最小元素後,直接與需要排序的位置進行交換
前一個方案,只要複製一條語句即可,然後進行一次交換。第二種交換,每一次交換,需要三條語句。第三種,只需要一次交換。
實現
import java.util.Arrays;
public class SelectionSort {
public static void main(String[] args) {
int[] nums = {5, 7, 3, 2, 9, 4, 2, 6, 8};
selectSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void selectSort(int[] nums){
//記錄排序部分的最後索引值
for (int i = 0; i < nums.length; i++) {
// 記錄未排序部分的開始值
int min_value = nums[i];
int min_index = i;
for (int j = i; j < nums.length; j++) {
// 找到未排序數組中的最小值及位置
if(nums[j]<min_value){
min_value = nums[j];
min_index = j;
}
}
// 找到了未排序數組中的最小值,然後跟要排序位置交換位置
nums[min_index] = nums[i];
nums[i] = min_value;
}
}
}
複雜度分析
從上面分析上,可以看到,時間消耗主要是在找到最小值上。
n+n-1+n-2+…
所以時間複雜度爲O(n^2)