选择排序
1. 排序思想
- 定义 i 下标遍历数组。
- 定义 minIndex 存储当前最小值的下标。
- 定义 j 变量从 i 下标后一个位置开始遍历,若遇到比 minIndex 小的就更新 minIndex。
- 交换 i 下标和 minIndex 的值。
- i ++ 排序下一个数据,j 再指向 i 的后一个。
- 直至整个数据为有序。
2. 排序步骤
-
i 指向0下标的位置,j 指向 i 下标后面一个位置。 假设当前最小值是在0下标,minIndex(图中简写) 记录当前最小值的下标。 注意: minIndex 始终记录当前最小值的下标。 -
比较 i 和 j 的值,如果 j 的值较小,minIndex 指向当前 j 的位置。 -
j ++ 找到下一个位置的数据,比较此时 j 和 minIndex 的值。 -
此时 j 的值较大,minIndex 则不需要更新位置,j ++ 找到下一个数据。 -
比较此时 j 和 minIndex 的值,此时 j 的值较小,minIndex 更新为 j 下标位置。 -
j ++ 找到下一个数据,比较此时 j 和 minIndex 的值。 此时 j 的值大于 minIndex 的值,minIndex 位置不需要更新。 -
j ++ 找到下一个数据,j 为空此时数据全部找完了。(minIndex此时指向最小的值) -
当 j 的值为空的时候,交换 i 和 minIndex 的值。 交换后: 此时的0下标的数据为有序了,i ++ 找到下一个数据。 j 继续为 i 的后一个位置,假设此时 i 为最小值。 -
最终会排序成:
3. 代码分析
- 循环遍历数组
for (int i = 0; i < array.length; i++) {
}
- 假设最小值是当前的 i 下标
int minIndex = i;
- j 从 i 后面一个位置开始遍历数组
for (int j = i + 1; j < array.length; j++) {
}
- 如果 j 的值小于 minIndex 的值,更新 minIndex 的值。
if (array[j] < array[minIndex]) {
minIndex = j;
}
- 交换 i 和 minIndex 的值。
if (i != minIndex) {
swap(array, minIndex, i);
}
- 交换的方法实现
public static void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
4. 整体代码实现
public static void selectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
if (i != minIndex) {
swap(array, minIndex, i);
}
}
}
public static void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
|