0 | 1 | 2 | 3 | 4 | 5 | 6 | … | n |
---|---|---|---|---|---|---|---|---|
30 | 4 | 22 | 345 | 1 | 23 | 7 | … | 5 |
基本思想
以从小到大排列为例, 每次循环找到剩余未排序数组中最小的值, 和未排序数组的第一个位置交换位置
详细分析
- 第1轮:假定arr[0]是最小元素,依次和后面的元素比较,较小者交换到arr[0]
第1轮结束后,arr[0]就是最小的元素了
- 第2轮:假定arr[1]是剩余元素中的最小值,依次和后面的元素比较,较小者交换到arr[1]
第2轮结束后,arr[1]就是剩余元素中的最小值了
-
以此类推…
-
第n轮:假定arr[n-1]是剩余元素中的最小值,依次和后面的元素比较,较小者交换到arr[n-1]
第2轮结束后,arr[n-1]就是剩余元素中的最小值了
- 最后剩下的arr[n],已经不用比了。
代码实现
public static void selectionSort(int[] arr) {
// 外层循环
for (int i = 0; i < arr.length - 1; i++) {
// 保存最小元素所在位置
int minIndex = i;
// 内层循环,把最小下标赋值给minIndex
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
swap(arr, i, minIndex); // 交换
}
}