diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77d6b25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/out/ + +*.iml + +.idea + +.DS_Store + diff --git a/src/leo/class01/BSExist.java b/src/leo/class01/BSExist.java new file mode 100644 index 0000000..e13a9b0 --- /dev/null +++ b/src/leo/class01/BSExist.java @@ -0,0 +1,87 @@ +package leo.class01; + + +import leo.util.ArrayUtil; + +import java.util.Arrays; + +/** + * @author Leo + * @ClassName BSExist + * @DATE 2020/11/12 10:14 上午 + * @Description 二分查找是否存在 + */ +public class BSExist { + + /** + * 功能描述 : 二分查找某数是否存在 + * @author Leo + * @date 2020/11/12 10:36 上午 + * @param arr 有序数组 + * @param value + * @return boolean + */ + public static boolean exist(int[] arr, int value) { + if (arr == null || arr.length == 0) { + return false; + } + int L = 0; + int R = arr.length - 1; + int mid = 0; + while (L < R) { + //右移一位表示除以2 + mid = L + ((R - L) >> 1); + if (arr[mid] == value) { + return true; + } else if (arr[mid] > value) { + R = mid - 1; + }else { + L = mid + 1; + } + } + return arr[L] == value; + } + + /** + * 功能描述 : test + * @author Leo + * @date 2020/11/12 10:36 上午 + * @param arr 二分查找某数是否存在 + * @param value + * @return boolean + */ + public static boolean forExist(int[] arr, int value) { + for (int i : arr) { + if (i == value) { + return true; + } + } + return false; + } + + + public static void main(String[] args){ + + int maxSize = 50; + int range = 500; + int testTime = 100; + boolean succeed = true; + for (int i = 0; i < testTime; i++) { + int[] sortArr = ArrayUtil.randomSortArray(maxSize, range); + int value = (int) ((range + 1) * Math.random() - (range + 1) * Math.random()); + + if (exist(sortArr, value) != forExist(sortArr, value)) { + succeed = false; + ArrayUtil.printArr(sortArr); + break; + } + } + System.out.println(succeed ? "Nice!" : "Fucking Fucked!"); + + + + + + } + +} diff --git a/src/leo/class01/BSNear.java b/src/leo/class01/BSNear.java new file mode 100644 index 0000000..fb558c6 --- /dev/null +++ b/src/leo/class01/BSNear.java @@ -0,0 +1,142 @@ +package leo.class01; + +import leo.util.ArrayUtil; + +/** + * @author Leo + * @ClassName BSNear + * @DATE 2020/11/12 11:18 上午 + * @Description + */ +public class BSNear { + + /** + * 功能描述 : 在有序数组中找出>=某个数最左侧的位置 + * @author Leo + * @date 2020/11/12 3:01 下午 + * @param arr + * @param value + * @return int + */ + public static int BSNearLeft(int[] arr, int value) { + if (arr == null || arr.length == 0) { + return -1; + } + int index = -1; + int L = 0; + int R = arr.length - 1; + while (L <= R) { + int mid = L + ((R - L) >> 1); + if (arr[mid] >= value) { + index = mid; + R = mid - 1; + } else { + L = mid + 1; + } + + } + return index; + } + + /** + * 功能描述 : 在有序数组中找出>=某个数最左侧的位置(for test) + * @author Leo + * @date 2020/11/12 3:02 下午 + * @param arr + * @param value + * @return int + */ + public static int forTestBSNearLeft(int[] arr, int value) { + if (arr == null || arr.length == 0) { + return -1; + } + for (int i = 0; i < arr.length; i++) { + if (arr[i] >= value) { + return i; + } + } + return -1; + } + + + + + + /** + * 功能描述 : 在有序数组中找出<=某个数最右侧的位置 + * @author Leo + * @date 2020/11/12 3:05 下午 + * @param arr + * @param value + * @throw + * @return int + */ + public static int BSNearRight(int[] arr, int value) { + int index = -1; + if (arr == null || arr.length == 0) { + return index; + } + int L = 0; + int R = arr.length - 1; + int mid = 0; + while (L <= R) { + mid = (L + R) >> 1; + if (arr[mid] <= value) { + index = mid; + L = mid + 1; + } else { + R = mid - 1; + } + } + return index; + } + + public static int forTestBSNearRight(int[] arr, int value) { + int index = -1; + if (arr == null || arr.length == 0) { + return index; + } + for (int i = arr.length - 1; i >= 0; i--) { + if (arr[i] <= value) { + return i; + } + } + return index; + } + + + public static void main(String[] args){ + int maxSize = 80; + int range = 800; + int testTime = 10000; + boolean success = true; + for (int i = 0; i < testTime; i++) { + int[] sortArr = ArrayUtil.randomSortArray(maxSize, range); + int value = (int) ((range + 1) * Math.random() - (range + 1) * Math.random()); + final int res1 = BSNearLeft(sortArr, value); + final int res2 = forTestBSNearLeft(sortArr, value); + final int res3 = BSNearRight(sortArr, value); + final int res4 = forTestBSNearRight(sortArr, value); + + if (res1 != res2) { + success = false; + ArrayUtil.printArr(sortArr); + System.out.println("BSNearLeft=" + res1); + System.out.println("forTestBSNearLeft=" + res2); + break; + } + if (res3 != res4) { + success = false; + ArrayUtil.printArr(sortArr); + System.out.println("BSNearRight=" + res3); + System.out.println("forTestBSNearRight=" + res4); + break; + } + } + System.out.println(success ? "Nice!!" : "Fucking Fucked!"); + } + + + + +} diff --git a/src/leo/class01/BubbleSort.java b/src/leo/class01/BubbleSort.java new file mode 100644 index 0000000..7e0ce8a --- /dev/null +++ b/src/leo/class01/BubbleSort.java @@ -0,0 +1,95 @@ +package leo.class01; + +import leo.util.ArrayUtil; + +import java.util.Arrays; + +/** + * @author Leo + * @ClassName BubbleSort + * @DATE 2020/11/11 9:05 下午 + * @Description 冒泡算法 + */ +public class BubbleSort { + + /** + * 功能描述 : 冒泡算法 O(n²) + * @author Leo + * @date 2020/11/11 10:09 下午 + * @param arr + * @return void + */ + public static void bubbleSort(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = arr.length-1; i > 0; i--) { + for (int j = 0; j < i; j++) { + if (arr[j] > arr[j + 1]) { + swap(arr, j, j + 1); + } + } + } + + } + + public static void bubbleSort2(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = arr.length - 1; i > 0; i--) { + for (int j = 0; j < i; j++) { + if (arr[j] > arr[j + 1]) { + swap(arr, j, j + 1); + } + } + } + } + + + + + /** + * 功能描述 : 交换 + * @author Leo + * @date 2020/11/11 6:34 下午 + * @param arr + * @param i + * @param j + * @return void + */ + private static void swap(int[] arr, int i, int j) { + if (arr == null || + arr.length <= i || + arr.length <= j || + i == j) { + return; + } + arr[i] = arr[i] ^ arr[j]; + arr[j] = arr[i] ^ arr[j]; + arr[i] = arr[i] ^ arr[j]; + } + + + public static void main(String[] args){ + int maxSize = 500; + int range = 20; + int testOfTime = 100000; + boolean succeed = true; + for (int i = 0; i < testOfTime; i++) { + int[] arr = ArrayUtil.randomArray(maxSize, range); + int[] anotherArr = ArrayUtil.copyArray(arr); + bubbleSort2(arr); + Arrays.sort(anotherArr); + if (!ArrayUtil.isEqual(arr, anotherArr)) { + succeed = false; + ArrayUtil.printArr(arr, "arr"); + ArrayUtil.printArr(anotherArr, "anotherArr"); + break; + } + } + System.out.println(succeed ? "Nice!" : "Fucking fucked!"); + + + } +} diff --git a/src/leo/class01/InsertionSort.java b/src/leo/class01/InsertionSort.java new file mode 100644 index 0000000..7f46ffe --- /dev/null +++ b/src/leo/class01/InsertionSort.java @@ -0,0 +1,75 @@ +package leo.class01; + +import leo.util.ArrayUtil; + +import java.util.Arrays; +import java.util.jar.JarEntry; + +/** + * @author Leo + * @ClassName InsertionSort + * @DATE 2020/11/12 9:21 上午 + * @Description + */ +public class InsertionSort { + + + /** + * 功能描述 : 插入排序 + * @author Leo + * @date 2020/11/12 9:58 上午 + * @param arr + * @throw + * @return void + */ + public static void insertionSort(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = 1; i < arr.length; i++) { + for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { + swap(arr, j, j + 1); + } + } + } + + + private static void swap(int[] arr, int i, int j) { + if (arr == null + || arr.length < 2 + || arr.length <= i + || arr.length <= j) { + return; + } + + arr[i] = arr[i] ^ arr[j]; + arr[j] = arr[i] ^ arr[j]; + arr[i] = arr[i] ^ arr[j]; + + + } + + + public static void main(String[] args){ + int maxSize = 50; + int range = 80; + int testOfTime = 100000; + boolean succeed = true; + for (int i = 0; i < testOfTime; i++) { + int[] arr = ArrayUtil.randomArray(maxSize, range); + int[] anotherArr = ArrayUtil.copyArray(arr); + insertionSort(arr); + Arrays.sort(anotherArr); + if (!ArrayUtil.isEqual(arr, anotherArr)) { + succeed = false; + ArrayUtil.printArr(arr, "arr"); + ArrayUtil.printArr(anotherArr, "anotherArr"); + break; + } + } + System.out.println(succeed ? "Nice!" : "Fucking fucked!"); + + + } + +} diff --git a/src/leo/class01/SelectionSort.java b/src/leo/class01/SelectionSort.java new file mode 100644 index 0000000..f2754c4 --- /dev/null +++ b/src/leo/class01/SelectionSort.java @@ -0,0 +1,130 @@ +package leo.class01; + +import leo.util.ArrayUtil; + +import java.util.Arrays; + +/** + * @author Leo + * @ClassName SelectionSort + * @DATE 2020/11/11 6:24 下午 + * @Description 选择排序 + */ +public class SelectionSort { + + /** + * 功能描述 : 选择排序 O(n²) + * @author Leo + * @date 2020/11/11 6:38 下午 + * @param arr + * @return void + */ + public static void selectionSort(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = 0; i < arr.length-1; i++) { + int minIndex = i; + for (int j = i + 1; j < arr.length; j++) { + minIndex = arr[j] > arr[minIndex] ? minIndex : j; + } + swap(arr, i, minIndex); + } + } + + + /** + * 功能描述 : + * @author Leo + * @date 2020/11/11 9:15 下午 + * @param arr + * @return void + */ + public static void selectionSort2(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = 0; i < arr.length-1; i++) { + int minIndex = i; + for (int j = i + 1; j < arr.length; j++) { + minIndex = arr[j] < arr[minIndex] ? j : minIndex; + } + swap(arr, i, minIndex); + } + } + + + public static void selectionSort3(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = 0; i < arr.length - 1; i++) { + int minIndex = i; + for (int j = i+1; j < arr.length; j++) { + minIndex = arr[j] > arr[minIndex] ? minIndex : j; + } + swap(arr, i, minIndex); + } + } + + + public static void selectionSort4(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + for (int i = 0; i < arr.length - 1; i++) { + int minIndex = i; + for (int j = i + 1; j < arr.length; j++) { + minIndex = arr[j] < arr[minIndex] ? j : minIndex; + } + swap(arr, i, minIndex); + } + } + + + /** + * 功能描述 : 交换 + * @author Leo + * @date 2020/11/11 6:34 下午 + * @param arr + * @param i + * @param j + * @return void + */ + private static void swap(int[] arr, int i, int j) { + if (arr == null || + arr.length <= i || + arr.length <= j || + i == j) { + return; + } + arr[j] = arr[j] ^ arr[i]; + arr[i] = arr[j] ^ arr[i]; + arr[j] = arr[j] ^ arr[i]; + } + + + public static void main(String[] args){ + int maxSize = 100; + int range = 50; + int testOfTime = 100000; + boolean succeed = true; + for (int i = 0; i < testOfTime; i++) { + int[] arr = ArrayUtil.randomArray(maxSize, range); + int[] anotherArr = ArrayUtil.copyArray(arr); + selectionSort4(arr); + Arrays.sort(anotherArr); + if (!ArrayUtil.isEqual(arr, anotherArr)) { + succeed = false; + ArrayUtil.printArr(arr, "arr"); + ArrayUtil.printArr(anotherArr, "anotherArr"); + break; + } + } + System.out.println(succeed ? "Nice!" : "Fucking fucked!"); + + + + } + +} diff --git a/src/leo/util/ArrayUtil.java b/src/leo/util/ArrayUtil.java new file mode 100644 index 0000000..12f9736 --- /dev/null +++ b/src/leo/util/ArrayUtil.java @@ -0,0 +1,159 @@ +package leo.util; + +import java.util.Arrays; + +/** + * @author Leo + * @ClassName util + * @DATE 2020/11/11 6:55 下午 + * @Description 对数器工具 + */ +public class ArrayUtil { + + + + /** + * 功能描述 : 随机生成数组 + * @author Leo + * @date 2020/11/11 6:57 下午 + * @param maxSize 数组最大值 + * @param range 数组元素范围 + * @return int[] + */ + public static int[] randomArray(int maxSize, int range) { + int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; + for (int i = 0; i < arr.length; i++) { + arr[i] = (int) ((range + 1) * Math.random()- (range * Math.random())) ; + } + return arr; + } + + + /** + * 功能描述 : 生成随机有序数组 + * @author Leo + * @date 2020/11/12 10:42 上午 + * @param maxSize + * @param range + * @return int[] + */ + public static int[] randomSortArray(int maxSize, int range) { + int[] arr = randomArray(maxSize, range); + Arrays.sort(arr); + return arr; + } + + /** + * 功能描述 : 复制数组 + * @author Leo + * @date 2020/11/11 6:57 下午 + * @param arr + * @return int[] + */ + public static int[] copyArray(int[] arr) { + int[] newArr = new int[arr.length]; + if (arr != null && arr.length > 0) { + for (int i = 0; i < arr.length; i++) { + newArr[i] = arr[i]; + } + return newArr; + } + return newArr ; + } + + /** + * 功能描述 : 判断数组是否一样 + * @author Leo + * @date 2020/11/11 7:20 下午 + * @param arr1 + * @param arr2 + * @return boolean + */ + public static boolean isEqual(int[] arr1, int[] arr2) { + return isEqual(arr1, arr2, false); + } + + /** + * 功能描述 : 判断数组是否一样并打印 + * @author Leo + * @date 2020/11/11 7:21 下午 + * @param arr1 + * @param arr2 + * @return boolean + */ + public static boolean isEqualAndPrint(int[] arr1, int[] arr2) { + return isEqual(arr1, arr2, true); + } + + + /** + * 功能描述 : 判断数组 + * @author Leo + * @date 2020/11/11 7:15 下午 + * @param arr1 + * @param arr2 + * @param printJudge 是否打印 + * @return boolean + */ + private static boolean isEqual(int[] arr1, int[] arr2,boolean printJudge) { + + if (printJudge) { + printArr(arr1, "arr1"); + printArr(arr2, "arr2"); + } + if (arr1 == null && arr2 == null) { + return true; + }else if (arr1 == null || arr2 == null) { + return false; + }else if (arr1.length != arr2.length) { + return false; + + } + for (int i = 0; i < arr1.length; i++) { + if (arr1[i] != arr2[i]) { + return false; + } + } + return true; + } + + /** + * 功能描述 : 打印数组 + * @author Leo + * @date 2020/11/11 7:15 下午 + * @param arr + * @param arrName + * @return void + */ + public static void printArr(int[] arr, String arrName) { + StringBuffer arrStr = new StringBuffer(); + arrName = arrName == null ? "arr" : arrName; + arrStr.append(" " + arrName + " = ["); + if (arr == null || arr.length <= 0) { + System.out.println(); + arrStr.append("]"); + } + + for (int i = 0; i < arr.length; i++) { + arrStr.append(" " + arr[i] + ","); + } + arrStr.substring(0, arrStr.length() - 2); + arrStr.append(" ]"); + System.out.println(arrStr); + } + + /** + * 功能描述 : 打印数组 + * @author Leo + * @date 2020/11/12 2:17 下午 + * @param arr + * @return void + */ + public static void printArr(int[] arr) { + printArr(arr, null); + + } + + + +}