1、选择排序
/*
选择排序
0到n-1位置,找到最小值,放到0位置;
1到n-1位置,找到最小值,放到1位置;
i到n-1位置,找到最小值,放到i位置;
以此类推;
*/
public class SelectionSort {
public static void main(String[] args) {
// 测试一下 swap方法
// int[] arr = {4, 3, 2};
// printArray(arr);
// swap(arr, 0, 1);
// printArray(arr);
// int[] arr = {7, 5, 6, 3};
// printArray(arr);
// selectionSort(arr);
// printArray(arr);
// 搞个对数器
int testTimes = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArr(arr1);
selectionSort(arr1);
Arrays.sort(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
System.out.println(succeed ? "Yes!!!" : "No!!!");
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if (arr1 == null && arr2 != null) {
return false;
}
if (arr1 != null && arr2 == null) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static int[] copyArr(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
public static int[] generateRandomArray(int maxSize, int maxValue) {
int size = (int) (Math.random() * (maxSize + 1));
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
}
return arr;
}
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int len = arr.length;
for (int i = 0; i < len; i++) {
int minIndex = i;
for (int j = i + 1; j < len; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void printArray(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
}
2、冒泡排序
/*
冒泡排序:
一个数组中的数,两两进行比较,较大的数字放到最后,跟气泡从水中冒出来一样,故称冒泡排序。
bubble
bubbling
0到n-1位置,0~1 1~2 2~3 ... n-2~n-1两两相比较,找到最大值,放到n-1位置;
0到n-2位置,0~1 1~2 2~3 ... n-3~n-2两两相比较,找到最大值,放到n-2位置;
0到i位置,0~1 1~2 2~3 ... i-1~i两两相比较,找到最大值,放到i位置;
以此类推;
*/
public class BubblingSort {
public static void main(String[] args) {
// int[] arr = {5, 0, 7, 8};
// printArray(arr);
// bubbleSort(arr);
// printArray(arr);
int testTimes = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArr(arr1);
bubbleSort(arr1);
Arrays.sort(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
}
}
System.out.println(succeed ? "Yes!!!" : "No!!!");
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static int[] copyArr(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private static int[] generateRandomArray(int maxSize, int maxValue) {
int len = (int) (Math.random() * (maxSize + 1));
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int) (Math.random() * maxValue + 1) - (int) (Math.random() * maxValue);
}
return arr;
}
private static void printArray(int[] arr) {
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
}
private static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = arr.length - 1; i >= 0; i--) {
for (int j = 1; j <= i; j++) {
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
}
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
3、插入排序
/*
插入排序:
先保证0~0范围上有序
先保证0~1范围上有序
先保证0~2范围上有序
以此类推
该课程在新手班第一节课【01:51:57 开始讲】
*/
public class InsertionSort {
public static void main(String[] args) {
int testTimes = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArr(arr1);
insertionSort(arr1);
Arrays.sort(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
System.out.println(succeed ? "Yes!!!" : "No!!!");
}
public static void insertionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
/*
该段内容在新手班第一节课【01.58.37】
0 ~ 0 完成
0 ~ 1
0 ~ 2
0 ~ 3
这里变化的是结尾,所以可以用参数end表示
*/
for (int end = 1; end < arr.length; end++) {
// 新来的数会在end位置上
int newNumIndex = end;
/*
end - 1 >= 0 说明end左边有数
arr[end - 1] > arr[end] 说明需要交换
*/
// while (end - 1 >= 0 && arr[end - 1] > arr[end]) {
// swap(arr, end - 1, end);
// }
// 把end替换成newNumIndex
while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
swap(arr, newNumIndex - 1, newNumIndex);
// 交换后,往左移动一位,继续比较
newNumIndex--;
}
}
}
private static int[] copyArr(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
public static int[] generateRandomArray(int maxSize, int maxValue) {
int size = (int) (Math.random() * (maxSize + 1));
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
}
return arr;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void printArray(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if (arr1 == null && arr2 != null) {
return false;
}
if (arr1 != null && arr2 == null) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
}