diff --git a/src/main/java/git/snippet/heap/Code_DistanceLessK.java b/src/main/java/git/snippet/heap/Code_DistanceLessK.java index 5575379460179dc6e652fd7ea4af744c1016f6b1..c4f943ffa7e4423dda6d6b8653fa80163065a620 100644 --- a/src/main/java/git/snippet/heap/Code_DistanceLessK.java +++ b/src/main/java/git/snippet/heap/Code_DistanceLessK.java @@ -1,6 +1,5 @@ package git.snippet.heap; -import java.util.Arrays; import java.util.PriorityQueue; // 笔记:https://www.cnblogs.com/greyzeng/p/16933830.html @@ -24,102 +23,4 @@ public class Code_DistanceLessK { arr[index++] = heap.poll(); } } - - // for test - public static void comparator(int[] arr, int k) { - Arrays.sort(arr); - } - - // for test - public static int[] randomArrayNoMoveMoreK(int maxSize, int maxValue, int K) { - int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; - for (int i = 0; i < arr.length; i++) { - arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); - } - // 先排个序 - Arrays.sort(arr); - // 然后开始随意交换,但是保证每个数距离不超过K - // swap[i] == true, 表示i位置已经参与过交换 - // swap[i] == false, 表示i位置没有参与过交换 - boolean[] isSwap = new boolean[arr.length]; - for (int i = 0; i < arr.length; i++) { - int j = Math.min(i + (int) (Math.random() * (K + 1)), arr.length - 1); - if (!isSwap[i] && !isSwap[j]) { - isSwap[i] = true; - isSwap[j] = true; - int tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; - } - } - return arr; - } - - // for test - public static int[] copyArray(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; - } - - // for test - public static boolean isEqual(int[] arr1, int[] arr2) { - if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) { - return false; - } - if (arr1 == 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; - } - - // for test - public static void printArray(int[] arr) { - if (arr == null) { - return; - } - for (int j : arr) { - System.out.print(j + " "); - } - System.out.println(); - } - - // for test - public static void main(String[] args) { - System.out.println("test begin"); - int testTime = 500000; - int maxSize = 100; - int maxValue = 100; - boolean succeed = true; - for (int i = 0; i < testTime; i++) { - int k = (int) (Math.random() * maxSize) + 1; - int[] arr = randomArrayNoMoveMoreK(maxSize, maxValue, k); - int[] arr1 = copyArray(arr); - int[] arr2 = copyArray(arr); - sortedArrDistanceLessK(arr1, k); - comparator(arr2, k); - if (!isEqual(arr1, arr2)) { - succeed = false; - System.out.println("K : " + k); - printArray(arr); - printArray(arr1); - printArray(arr2); - break; - } - } - System.out.println(succeed ? "Nice!" : "Fucking fucked!"); - } } diff --git a/src/test/java/git/snippet/heap/Code_DistanceLessKTest.java b/src/test/java/git/snippet/heap/Code_DistanceLessKTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a8e91063a5a4a7334a56b4689a90cdb57c3a59fa --- /dev/null +++ b/src/test/java/git/snippet/heap/Code_DistanceLessKTest.java @@ -0,0 +1,58 @@ +package git.snippet.heap; + +import git.snippet.common.Generator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("几乎有序的数组排序测试") +public class Code_DistanceLessKTest { + + @Test + @DisplayName("几乎有序的数组排序测试") + public void sortedArrDistanceLessK() { + int testTime = 500000; + int maxSize = 100; + int maxValue = 100; + for (int i = 0; i < testTime; i++) { + int k = (int) (Math.random() * maxSize) + 1; + int[] arr = randomArrayNoMoveMoreK(maxSize, maxValue, k); + int[] arr1 = Generator.copyArray(arr); + int[] arr2 = Generator.copyArray(arr); + Code_DistanceLessK.sortedArrDistanceLessK(arr1, k); + Arrays.sort(arr2); + Assertions.assertArrayEquals(arr1, arr2); + } + } + + + // for test + public static int[] randomArrayNoMoveMoreK(int maxSize, int maxValue, int K) { + int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; + for (int i = 0; i < arr.length; i++) { + arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); + } + // 先排个序 + Arrays.sort(arr); + // 然后开始随意交换,但是保证每个数距离不超过K + // swap[i] == true, 表示i位置已经参与过交换 + // swap[i] == false, 表示i位置没有参与过交换 + boolean[] isSwap = new boolean[arr.length]; + for (int i = 0; i < arr.length; i++) { + int j = Math.min(i + (int) (Math.random() * (K + 1)), arr.length - 1); + if (!isSwap[i] && !isSwap[j]) { + isSwap[i] = true; + isSwap[j] = true; + int tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + } + return arr; + } + +} \ No newline at end of file