本文正在參加「Java主題月 - Java 刷題打卡」,詳情查看 活動連接java
在無序序列中查找最小(大)元素,從頭至尾掃描序列,查找最小的元素,和第一個元素交換位置,再從剩餘未排序元素中查找最小(大)元素,而後存放到已排序序列的末尾,繼續這種選擇和交換方式,直到全部元素都排序完成。算法
原始序列:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36數組
結果:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36markdown
2.從無序序列中查找最小的元素爲2,將2跟無序序列第一個元素交換,此時產生一個含有一個元素的有序序列,而無序序列元素個數減一app
結果:有序:{2} ,無序:{6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}post
3.從無序序列中查找最小的元素爲6,將6跟無序序列第一個元素交換,此時有序序列元素有兩個,而無序序列元素個數減一ui
結果:有序:{2,6},無序:{11, 8, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}url
4.從無序序列中查找最小的元素爲8,將8跟無序序列第一個元素交換,此時有序序列元素有三個,而無序序列元素個數減一spa
結果:有序:{2,6,8},無序:{11, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}3d
...
從無序序列中查找最小的元素爲31,將31跟無序序列第一個元素交換,此時有序序列元素有12個,而無序序列元素個數減一
結果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31},無序:{49, 56, 36}
從無序序列中查找最小的元素爲36,將36跟無序序列第一個元素交換,此時有序序列元素有13個,而無序序列元素個數減一
結果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36},無序:{56, 49}
從無序序列中查找最小的元素爲49,將49跟無序序列第一個元素交換,此時有序序列元素有14個,而無序序列元素個數減一
結果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36, 49},無序:{56}
最後通過選擇排序後結果以下: 有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36, 49, 56}
/** * @Description: 選擇排序算法 * @Author Gxin * @Date 2021/5/26 **/
public class SelectionSort {
public static void selectionSort(int[] arr) {
if (arr.length < 2 || arr == null) {
return;
}
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;
}
System.out.println("第" + (i + 1) + "輪結束序列爲:" + Arrays.toString(arr) + " ,最小值爲" + arr[minIndex] + ",最小值下標爲" + minIndex);
swap(arr, i, minIndex);
}
System.out.println("結果:" + Arrays.toString(arr));
}
private static void swap(int[] arr, int i, int minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
public static void main(String[] args) {
int[] arr = {31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36};
selectionSort(arr);
}
}
複製代碼
結果和算法分析過程是同樣,通過14輪比較後數組成爲有序數組。
選擇排序時間複雜度:O(N^2),使用選擇排序對數據規模越小越好,好處是一次比較最須要換一次位置,缺點是效率慢,不穩定(好比11,8,11,6,10,第一遍選擇第一個最小元素6會和11交換,那原序列中2個11的相對位置先後順序被破壞了)