package class01;
import java.util.Arrays;
/**
* 选择排序
* 概述:n个数,n次循环(10个数就是10次循环),每次循环找出本轮的最小值,和本轮的第一个位置的数,交换。周而复始。直至该乱序数组有序。
*/
public class Code01_SelectionSort {
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
for (int i = 0; i < N - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < N; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
}
public static void main(String[] args) {
int testTimes = 10;
int maxSize = 15;
int maxValue = 100;
boolean flag = true;
for (int i = 0; i < testTimes; i++) {
int[] arr = generateRandomArr(maxSize, maxValue);
int[] arr1 = copyArr(arr);
int[] arr2 = copyArr(arr);
Arrays.sort(arr1);
selectionSort(arr2);
// printArr(arr);
// printArr(arr1);
// printArr(arr2);
flag = isEquals(arr1, arr2);
if (!flag) {
printArr(arr);
printArr(arr1);
printArr(arr2);
break;
}
}
System.out.println(flag ? "Nice!" : "Fucking fucked!");
int[] arr = generateRandomArr(maxSize, maxValue);
printArr(arr);
selectionSort(arr);
printArr(arr);
}
public static boolean isEquals(int[] arr1, int[] arr2) {
boolean flag = true;
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
flag = false;
break;
}
}
return flag;
}
public static int[] copyArr(int[] arr) {
int[] arr2 = new int[arr.length];
int N = arr.length;
for (int i = 0; i < N; i++) {
arr2[i] = arr[i];
}
return arr2;
}
//生成一个长度随机,元素的值也随机的数组。
public static int[] generateRandomArr(int maxSize, int maxValue) {
//Math.random(): [0, 1)上的所有小数,等概率返回一个。
//Math.random() * N:[0, N)上的所有小数,等概率返回一个。
//(int) Math.random() * N:[0, N)上的所有整数,等概率返回一个。
int[] arr = new int[(int) (Math.random() * maxSize)];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * maxValue) - (int) (Math.random() * maxValue);
}
return arr;
}
public static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}