diff --git a/.gitignore b/.gitignore index f6cbc5f..28fee88 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,14 @@ _book *.pdf \.idea/ +# idea *.iml -src/javaSortTest/target/ +# elipse +.classpath +.project +.settings + +# build +target +bin \ No newline at end of file diff --git a/5.mergeSort.md b/5.mergeSort.md index bf0de32..2379ad6 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -143,47 +143,52 @@ func merge(left []int, right []int) []int { public class MergeSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); + public int[] sort(int[] arr) throws Exception { + mergeSort(arr, 0, arr.length - 1); + return arr; + } - if (arr.length < 2) { - return arr; + private void mergeSort(int[] arr, int left, int right) { + if (left >= right) { + return; } - int middle = (int) Math.floor(arr.length / 2); - int[] left = Arrays.copyOfRange(arr, 0, middle); - int[] right = Arrays.copyOfRange(arr, middle, arr.length); + int mid = (right + left) / 2; - return merge(sort(left), sort(right)); + //分 + mergeSort(arr, left, mid); + mergeSort(arr, mid + 1, right); + //治 + merge(arr, left, mid, right); } - protected int[] merge(int[] left, int[] right) { - int[] result = new int[left.length + right.length]; - int i = 0; - while (left.length > 0 && right.length > 0) { - if (left[0] <= right[0]) { - result[i++] = left[0]; - left = Arrays.copyOfRange(left, 1, left.length); + + /** + * 主要思想, 两个已经排序好的数组, 如何归并 + * 当元素个数趋近单个元素时, 归并即为排序过程 + */ + private void merge(int[] arr, int left, int mid, int right) { + int[] tmp = new int[right - left + 1]; + + int i = left; + int j = mid + 1; + int k = 0; + + while (i <= mid && j <= right) { + if (arr[i] <= arr[j]) { //取等号, 优先匹配左边数组予以填充 + tmp[k++] = arr[i++]; } else { - result[i++] = right[0]; - right = Arrays.copyOfRange(right, 1, right.length); + tmp[k++] = arr[j++]; } } - while (left.length > 0) { - result[i++] = left[0]; - left = Arrays.copyOfRange(left, 1, left.length); - } - - while (right.length > 0) { - result[i++] = right[0]; - right = Arrays.copyOfRange(right, 1, right.length); - } + //队尾的直接填充 + while (i <= mid) tmp[k++] = arr[i++]; + while (j <= right) tmp[k++] = arr[j++]; - return result; + //覆盖原数组 + System.arraycopy(tmp, 0, arr, left, tmp.length); } - } ``` diff --git a/src/java/main/BubbleSort.java b/src/java/main/BubbleSort.java index 3c8cebc..9e99ee4 100644 --- a/src/java/main/BubbleSort.java +++ b/src/java/main/BubbleSort.java @@ -6,10 +6,7 @@ public class BubbleSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { for (int i = 1; i < arr.length; i++) { // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。 boolean flag = true; diff --git a/src/java/main/BucketSort.java b/src/java/main/BucketSort.java index c0b5183..2d80c29 100644 --- a/src/java/main/BucketSort.java +++ b/src/java/main/BucketSort.java @@ -8,10 +8,7 @@ public class BucketSort implements IArraySort { private static final InsertSort insertSort = new InsertSort(); @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { return bucketSort(arr, 5); } diff --git a/src/java/main/CountingSort.java b/src/java/main/CountingSort.java index 74fcd2a..cfbce9f 100644 --- a/src/java/main/CountingSort.java +++ b/src/java/main/CountingSort.java @@ -6,10 +6,7 @@ public class CountingSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { int maxValue = getMaxValue(arr); return countingSort(arr, maxValue); diff --git a/src/java/main/HeapSort.java b/src/java/main/HeapSort.java index 6e9dcfe..6b5ca3f 100644 --- a/src/java/main/HeapSort.java +++ b/src/java/main/HeapSort.java @@ -6,10 +6,7 @@ public class HeapSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { int len = arr.length; buildMaxHeap(arr, len); diff --git a/src/java/main/InsertSort.java b/src/java/main/InsertSort.java index 1321972..6eac37a 100644 --- a/src/java/main/InsertSort.java +++ b/src/java/main/InsertSort.java @@ -6,10 +6,7 @@ public class InsertSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的 for (int i = 1; i < arr.length; i++) { diff --git a/src/java/main/MergeSort.java b/src/java/main/MergeSort.java index 6457036..bed6cf0 100644 --- a/src/java/main/MergeSort.java +++ b/src/java/main/MergeSort.java @@ -1,50 +1,55 @@ -import java.util.Arrays; - /** * 归并排序 + * @author qrqhuangcy + * @date 2020/5/4 */ public class MergeSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); + public int[] sort(int[] arr) throws Exception { + mergeSort(arr, 0, arr.length - 1); + return arr; + } - if (arr.length < 2) { - return arr; + private void mergeSort(int[] arr, int left, int right) { + if (left >= right) { + return; } - int middle = (int) Math.floor(arr.length / 2); - int[] left = Arrays.copyOfRange(arr, 0, middle); - int[] right = Arrays.copyOfRange(arr, middle, arr.length); + int mid = (right + left) / 2; - return merge(sort(left), sort(right)); + //分 + mergeSort(arr, left, mid); + mergeSort(arr, mid + 1, right); + //治 + merge(arr, left, mid, right); } - protected int[] merge(int[] left, int[] right) { - int[] result = new int[left.length + right.length]; - int l = 0, r = 0, len = 0; - while (len < left.length + right.length) { - if (left[l] <= right[r]) { - result[len++] = left[l++]; - - if (l == left.length) { - for (int i = r; i < right.length; i++) { - result[len++] = right[r++]; - } - } - } else { - result[len++] = right[r++]; - if (r == right.length) { - for (int i = l; i < left.length; i++) { - result[len++] = left[l++]; - } - } + /** + * 主要思想, 两个已经排序好的数组, 如何归并 + * 当元素个数趋近单个元素时, 归并即为排序过程 + */ + private void merge(int[] arr, int left, int mid, int right) { + int[] tmp = new int[right - left + 1]; + + int i = left; + int j = mid + 1; + int k = 0; + + while (i <= mid && j <= right) { + if (arr[i] <= arr[j]) { //取等号, 优先匹配左边数组予以填充 + tmp[k++] = arr[i++]; + } else { + tmp[k++] = arr[j++]; } } - return result; - } + //队尾的直接填充 + while (i <= mid) tmp[k++] = arr[i++]; + while (j <= right) tmp[k++] = arr[j++]; + //覆盖原数组 + System.arraycopy(tmp, 0, arr, left, tmp.length); + } } diff --git a/src/java/main/QuickSort.java b/src/java/main/QuickSort.java index 1c598ed..838827b 100644 --- a/src/java/main/QuickSort.java +++ b/src/java/main/QuickSort.java @@ -6,10 +6,7 @@ public class QuickSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { return quickSort(arr, 0, arr.length - 1); } diff --git a/src/java/main/RadixSort.java b/src/java/main/RadixSort.java index 9052e76..3c9adaa 100644 --- a/src/java/main/RadixSort.java +++ b/src/java/main/RadixSort.java @@ -8,10 +8,7 @@ public class RadixSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { int maxDigit = getMaxDigit(arr); return radixSort(arr, maxDigit); } diff --git a/src/java/main/SelectionSort.java b/src/java/main/SelectionSort.java index 0cee685..7c188b3 100644 --- a/src/java/main/SelectionSort.java +++ b/src/java/main/SelectionSort.java @@ -6,9 +6,7 @@ public class SelectionSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { // 总共要经过 N-1 轮比较 for (int i = 0; i < arr.length - 1; i++) { int min = i; diff --git a/src/java/main/ShellSort.java b/src/java/main/ShellSort.java index 6c0fbb1..fbb5cae 100644 --- a/src/java/main/ShellSort.java +++ b/src/java/main/ShellSort.java @@ -1,15 +1,10 @@ -import java.util.Arrays; - /** * 希尔排序 */ public class ShellSort implements IArraySort { @Override - public int[] sort(int[] sourceArray) throws Exception { - // 对 arr 进行拷贝,不改变参数内容 - int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); - + public int[] sort(int[] arr) throws Exception { int gap = 1; while (gap < arr.length) { gap = gap * 3 + 1; diff --git a/src/java/pom.xml b/src/java/pom.xml index 60b4858..70e5dc6 100644 --- a/src/java/pom.xml +++ b/src/java/pom.xml @@ -33,6 +33,9 @@ + main + test + org.apache.maven.plugins diff --git a/src/java/target/maven-archiver/pom.properties b/src/java/target/maven-archiver/pom.properties deleted file mode 100644 index 5239a24..0000000 --- a/src/java/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Fri Jan 05 09:51:14 CST 2018 -version=1.0-SNAPSHOT -groupId=com.corning -artifactId=sort diff --git a/src/java/target/sort-1.0-SNAPSHOT.jar b/src/java/target/sort-1.0-SNAPSHOT.jar deleted file mode 100644 index 14116be..0000000 Binary files a/src/java/target/sort-1.0-SNAPSHOT.jar and /dev/null differ diff --git a/src/java/test/ArraySortTest.java b/src/java/test/ArraySortTest.java index 580701f..9fd348a 100644 --- a/src/java/test/ArraySortTest.java +++ b/src/java/test/ArraySortTest.java @@ -101,13 +101,6 @@ public void mergeSort() throws Exception { assertArrayEquals(sortedArray, new MergeSort().sort(array)); } - @Test - public void mergeSort_merge() throws Exception { - assertArrayEquals(new int[]{1, 2}, new MergeSort().merge(new int[]{1, 2}, new int[]{})); - assertArrayEquals(new int[]{1, 2}, new MergeSort().merge(new int[]{1}, new int[]{2})); - assertArrayEquals(new int[]{1, 2, 3}, new MergeSort().merge(new int[]{1, 3}, new int[]{2})); - } - @Test public void quickSort() throws Exception { assertArrayEquals(sortedArray, new QuickSort().sort(array));