時間復(fù)雜度:O(N^2)
額外空間復(fù)雜度:O(1)
是否可實現(xiàn)穩(wěn)定性:否
思路:
初始化一個變量minIndex用來存儲最小數(shù)值的下標(biāo),每次循環(huán)找出最小下標(biāo)minIndex,然后和當(dāng)前外層循環(huán)最前面的數(shù)交換,就能做到每次把本次循環(huán)中的最小數(shù)值放到最前面
例子:
比如一組數(shù){2,5,1,9}
每次初始化minIndex為當(dāng)前外循環(huán)的最前面的數(shù)字,第一次minIndex=0
比較2和5,2<5所以minIndex值不變,再比較2和1,2>1所以minIndex的值變成2
再比較1和9,1<9,minIndex不變,此時所有數(shù)值比較完畢,然后交換minIndex和i的值,i代表外層循環(huán)的位置
第二次循環(huán),minIndex=1,過程和第一次一樣,依次執(zhí)行下去得到結(jié)果
代碼:
public static void selectionSort(int[] arr){
if (arr==null||arr.length<2){
return;
}
/*
* 選擇排序的思想: 遍歷數(shù)組 初始化一個變量,代表每次循環(huán)找到的最小的數(shù)的下標(biāo)
* 內(nèi)循環(huán),每一次找的都是最小數(shù)的下標(biāo),然后每次用當(dāng)前最小下標(biāo)的元素和arr[j]比較,
* 看看當(dāng)前的下表是否是最小下標(biāo) 循環(huán)結(jié)束,minIndex就是這一次循環(huán)找到的最小的數(shù)的下標(biāo)
* 然后交換i和minIndex的下標(biāo)
* i代表每次開始的位置也就是每次循環(huán)最小的位置
**/
for (int i = 0;i<arr.length;i++){
int minIndex = i;
for (int j = i+1;j<arr.length;j++){
minIndex = arr[minIndex] < arr[j]?minIndex:j;
}
swap(arr,i,minIndex);
}
}
public static void swap(int[]arr,int i ,int j){
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
在這里注意,選擇排序是不穩(wěn)定的,舉個例子序列5 8 5 2 9, 我們知道第一遍選擇第1個元素5會和2交換,那么原序列中2個5的相對前后順序就被破壞了。