選擇排序(Selection Sort)算法簡介:
選擇排序是利用逐個選擇的方式進行排序,逐個選擇出數組中的最小(或最大)的元素,順序放在已排好序的序列後面,直到全部記錄排序完畢。
選擇排序(Selection Sort)算法原理:
例如我們有一個數組,我們需要把較小的元素排在前面,把較大的元素排在後面,那麼需要選擇出最小元素並將其排在序列最前:
- 從待排序列中選出最小(或最大)的一個元素,記錄其下標的位置;
- 將記錄的下標值與待排序列的第一個元素進行交換;
- 以此類推,直到全部待排序列的元素排完。
舉例說明:
現在需要對數組序列 6 1 7 8 9 3 5 4 2 運用選擇排序算法從小到大排序。
第一輪:最小元素爲1,把1放在首位,也就是1和6互換位置:1 6 7 8 9 3 5 4 2
第二輪:將排序好的元素以外的序列6 7 8 9 3 5 4 2進行比較,最小元素爲2,將2與第二位的6互換位置:1 2 7 8 9 3 5 4 6
第三輪:將排序好的元素以外的序列7 8 9 3 5 4 6 進行比較,最小元素爲3,將3與第三位的7互換位置:1 2 3 8 9 7 5 4 6
.................
第n輪:重複同樣的操作直到所有數字都歸位爲止,排序完成。
選擇排序(Selection Sort)代碼實現:
public class Demo {
public static void main(String[] args) {
int[] array= {6,1,7,8,9,3,5,4,2};
int[] newarray=selectionSort(array);
for(int arr:newarray) {
System.out.print(arr+" ");
}
}
public static int[] selectionSort(int[] array){
//外層循環,控制選擇的次數
for(int i=0;i<array.length-1;i++) {
int min_index=i;
//內存循環
for(int j=i+1;j<array.length;j++) {
if(array[j]<array[min_index]) {
min_index=j;
}
}
if(min_index!=i) {
int temp=array[i];
array[i]=array[min_index];
array[min_index]=temp;
}
}
return array;
}
}
選擇排序(Selection Sort)的時間複雜度:
選擇排序使用了線性查找來尋找最小值,因此在第1輪中需要比較n-1個數字,第2輪需要比較n-2個數.....到第n-1輪的時候就只需比較1個數字了。因此,總的比較次數與冒泡排序的相同,都是(n-1)+(n-2) +...+1≈n²/2次。每輪中交換數字的次數最多爲1次。如果輸入數據就是按從小到大的順序排列的,便不需要進行任何交換。選擇排序的時間複雜度也和冒泡排序的一樣,都爲O(n²)。