package class01;
/**
* 选择排序
*/
//思路:n个数,n次循环(10个数就是10次循环),每次循环找出本轮的最小值,和本轮的第一个位置的数,交换。周而复始。直至该乱序数组有序。
public class Code02_SelectionSort {
public static void main(String[] args) {
int[] arr = {8, 6, 4, 5, 11, 3, 2, 7, 9, 7, 8};
printArr(arr);
selectSort(arr);
printArr(arr);
}
public static void selectSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
//0~n-1范围上,做一堆事儿。
//1~n-1范围上,做一堆事儿。
//2~n-1范围上,做一堆事儿。
//...
//即:i~n-1范围上,做一堆事儿。得出外层循环。i从0开始,i<n,即i<=n-1。
//所以一共是n次循环,第一次循环,找出在这个范围上的最小值的索引(使用的三元表达式),
//让这个最小值(位置可能是第二个位置,可能在中间,也可能在最后一个位置),和本次循环的第一个位置(索引0)上的数,交换。此时第一个数不用管了,i就可以++了。
//第二次循环,第三次循环...周而复始。
for (int i = 0; i < N; i++) {
int minValueIndex = i;
for (int j = i + 1; j < N; j++) {//直接让i+1位置上的数,和最小值比较。
//如果从第二个数(含)往后,有比最小值还小的,则更新最小值索引为j。否则最小值的索引minValueIndex还是它自己。
minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;
}
swap(arr, i, minValueIndex);//将最小值,和本轮循环的第一个位置的数,交换。
}
}
public static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}