目錄
1.1基本操作:
1.2動態圖:
1.3代碼:
代碼解釋
1.?main?方法
2.?selectSort?方法
示例運行過程
初始數組
每輪排序后的數組
最終排序結果
代碼總結
1.1基本操作:
選擇排序(select sorting)也是一種簡單的排序方法。
它的基本思想是:第一次從arr[0到]arr[n-1]中選取最小值,與arr[0]交換,第二次從arr[1]到arr[n-1]中選取最小值,與arr[1]交換,第三次從arr[2]到arr[n-1]中選取最小值,與arr[2]交換,…,第i次從arr[i-1]arr[n-1]中選取最小值,與arr[i-1]交換,…, 第n-1次從arr[n-2]~arr[n-1]中選取最小值,與arr[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列。
1.2動態圖:
1.3代碼:
public class Insert {public static void main(String[] args) {int[] arr = {8,65,41,28,6,1,4,5,32,9,10};System.out.println("排序前");System.out.println(Arrays.toString(arr));selectSort(arr);}public static void selectSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {//尋找最小值,將當前的作為最小值來看待int minIndex = i;int min = arr[i];for (int j = i + 1; j < arr.length; j++) {// 當前值的下一個值和當前值判斷大小,如果先一個值小,那么就進行交換 ,// 當然要記錄一下當前值的 下標 ,目的是為了當前值和第一個值進行交換if (min > arr[j]) {min = arr[j];minIndex = j;}}//進行交換arr[minIndex] = arr[i];arr[i] = min;System.out.println("第" + (i + 1) + "輪后");System.out.println(Arrays.toString(arr));}}
}
代碼解釋
1.?main
?方法
public static void main(String[] args) {
? ? int[] arr = {8, 65, 41, 28, 6, 1, 4, 5, 32, 9, 10};
? ? System.out.println("排序前");
? ? System.out.println(Arrays.toString(arr));
? ? selectSort(arr);
}
-
功能:程序的入口。
-
邏輯:
-
定義了一個未排序的整數數組?
arr
。 -
打印排序前的數組。
-
調用?
selectSort
?方法對數組進行排序。
-
2.?selectSort
?方法
public static void selectSort(int[] arr) {
? ? for (int i = 0; i < arr.length - 1; i++) {
? ? ? ? // 尋找最小值,將當前的作為最小值來看待
? ? ? ? int minIndex = i;
? ? ? ? int min = arr[i];
? ? ? ? for (int j = i + 1; j < arr.length; j++) {
? ? ? ? ? ? // 當前值的下一個值和當前值判斷大小,如果下一個值小,那么就更新最小值和最小值的下標
? ? ? ? ? ? if (min > arr[j]) {
? ? ? ? ? ? ? ? min = arr[j];
? ? ? ? ? ? ? ? minIndex = j;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 進行交換
? ? ? ? arr[minIndex] = arr[i];
? ? ? ? arr[i] = min;
? ? ? ? System.out.println("第" + (i + 1) + "輪后");
? ? ? ? System.out.println(Arrays.toString(arr));
? ? }
}
-
功能:實現選擇排序算法。
-
邏輯:
-
外層循環:
-
遍歷數組,從第一個元素到倒數第二個元素(
i
?從?0
?到?arr.length - 2
)。 -
每次循環的目的是找到未排序部分的最小值,并將其放到已排序部分的末尾。
-
-
初始化最小值和最小值的下標:
-
minIndex
?記錄當前最小值的下標,初始值為?i
。 -
min
?記錄當前最小值,初始值為?arr[i]
。
-
-
內層循環:
-
從?
i + 1
?開始遍歷未排序部分。 -
如果找到比?
min
?更小的值,則更新?min
?和?minIndex
。
-
-
交換最小值:
-
將找到的最小值與當前外層循環的位置?
i
?的值進行交換。
-
-
打印每輪排序后的數組:
-
每輪排序后,打印當前數組的狀態。
-
-
示例運行過程
初始數組
[8, 65, 41, 28, 6, 1, 4, 5, 32, 9, 10]
每輪排序后的數組
-
第1輪:
-
找到最小值?
1
,與第一個元素?8
?交換。 -
結果:
[1, 65, 41, 28, 6, 8, 4, 5, 32, 9, 10]
-
-
第2輪:
-
找到最小值?
4
,與第二個元素?65
?交換。 -
結果:
[1, 4, 41, 28, 6, 8, 65, 5, 32, 9, 10]
-
-
第3輪:
-
找到最小值?
5
,與第三個元素?41
?交換。 -
結果:
[1, 4, 5, 28, 6, 8, 65, 41, 32, 9, 10]
-
-
第4輪:
-
找到最小值?
6
,與第四個元素?28
?交換。 -
結果:
[1, 4, 5, 6, 28, 8, 65, 41, 32, 9, 10]
-
-
第5輪:
-
找到最小值?
8
,與第五個元素?28
?交換。 -
結果:
[1, 4, 5, 6, 8, 28, 65, 41, 32, 9, 10]
-
-
第6輪:
-
找到最小值?
9
,與第六個元素?28
?交換。 -
結果:
[1, 4, 5, 6, 8, 9, 65, 41, 32, 28, 10]
-
-
第7輪:
-
找到最小值?
10
,與第七個元素?65
?交換。 -
結果:
[1, 4, 5, 6, 8, 9, 10, 41, 32, 28, 65]
-
-
第8輪:
-
找到最小值?
28
,與第八個元素?41
?交換。 -
結果:
[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]
-
-
第9輪:
-
找到最小值?
32
,與第九個元素?32
?交換(無需交換)。 -
結果:
[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]
-
-
第10輪:
-
找到最小值?
41
,與第十個元素?41
?交換(無需交換)。 -
結果:
[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]
-
最終排序結果
[1, 4, 5, 6, 8, 9, 10, 28, 32, 41, 65]
代碼總結
-
算法:選擇排序。
-
時間復雜度:O(n2),其中?
n
?是數組的長度。 -
空間復雜度:O(1),原地排序,不需要額外的空間。
-
優點:實現簡單,適合小規模數據。
-
缺點:時間復雜度較高,不適合大規模數據。