选择排序
分为已排区间(在左边)和未排区间(在右边)。每次从未排区间找出一个 min ,放到已排区间的末尾。
0-N-1 遍历一次找出最小值,放在 0 位上。
1 到 N-1 上遍历一次,找出最小值,放在 1 位置上。直到排好序。
时间复杂度是 O(N2),空间复杂度是 O(1)
思路:一个类两个方法,一个 swap 方法,一个 selectSort 方法,先思考临界条件,两层 for 循环:第一层 for 循环。(设置 i 已排区域的末尾,遍历。设置 min=i),第二层 for 循环:int j = i +1,当 i = 0,j=1,2,3....arr.length ,找到最小值(此时已经结束第二个 for 循环),在第一个 for 循环结束时,执行交换方法。
package suanfa;
public class xuanzhe {
public static void selectSort(int[] arr) {
if (arr == null || arr.length < 2) { //临界
return;
}
for (int i = 0; i < arr.length - 1; i++) { //两层for循环,i,是已排区域的末尾
int minIndex = i; //假设 第0 位的为 min
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex; //找出最小值,注意,这里没有 i
}
swap(arr, i, minIndex); //最小值,与已排区域末尾交换
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int[] arr = { 1, 8, 56, 984, 14, -84 };
System.out.println(java.util.Arrays.toString(arr));
selectSort(arr);
System.out.println(java.util.Arrays.toString(arr));
}
}
1. 注意了呀,这里是 for 中是临时变量啊啊 啊啊
2. 逻辑出现了问题,第二个 for 循环是比较的 j 与 min ,不是 j 与 j + 1。