From 401a3caf82994aa9273e655762455d892ec6af95 Mon Sep 17 00:00:00 2001 From: qrqhuangcy Date: Mon, 4 May 2020 04:03:40 +0800 Subject: [PATCH 1/4] git ignore --- .gitignore | 10 +++++++++- src/java/target/maven-archiver/pom.properties | 5 ----- src/java/target/sort-1.0-SNAPSHOT.jar | Bin 1873 -> 0 bytes 3 files changed, 9 insertions(+), 6 deletions(-) delete mode 100644 src/java/target/maven-archiver/pom.properties delete mode 100644 src/java/target/sort-1.0-SNAPSHOT.jar 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/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 14116be182c4c2420e6bb6f38aabdf9be82da556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 zcmWIWW@h1H0D%lYRUa?|N^k;cU)K;vT~9wZ{Q#&k4u*7~vRmhm+|L6_w*avSvNB&s zKTkK;;1E4ux6i(3PWyQ4>RsgZ*3~+9=KSU$gDb`lo)+nNojal9t?R_W{$xqm6fx}s zDiu5Dco`RamCV&zD>CVG_a~#zmnwJ8=?)V14hlZd)W_O+QgS8NzRuK@m0ZWFj#W() z(AC@(r+HH$TIUPTBVFFgofSJ7VD7{820ya`>gtX?fco^&CYq5^QxpC(_GEPsT|JRdo>G`uirk_@KNl}tve0V9b8j2BVYQr>y)#eJY+SO z?}g6GhNE6fx!&imxgOefVJoNTrKNJ`+POFBe0gd0Ic8<*Ih}mpq>|Qrhv?4@Rr<=Y zXE{5W_iw#fkYK$!CBiQ6af2(D>r6%Gf{x5NyA<87_b#aNkzLWKKbyNVi4NChP?xu<&YXWOKkO#DegKO8p9 zsIJhR>A1xGLSwLHWxkS6t?7Z?3SWzAw{8r}=eg1&t7`Rmk=IcZ*M)~gl--tY-!B}j z%r9z129b5U(}`Db(CBf48B zDYx=Ov2dHMaP=-fr;{)#y~%j-yBU8&l*J}86yIj?FI)ZKhR_b98@G*RFS+zzRLeXX zQ}21~eDCC{Jy-Hp9rT`eUd?Oz_6;USo>cBpniCYndtWl`pL)CNnZn5hHuDd6Cv0R| z^*`$)>+Nm7?(h3jZ~uC)#hbUbwm)~>x3}7oQ*Cr#kl*u4z+>GBPYlDtC-3Dy^lWAE zpT~z^{#IXZfB##5+}U+Awapg?z5f~a{^|3_@7dMa*Z<%1JELpvzMmz3vg@lPo%Skx z+xRj?j9XXd0P9_g8-=&mF$dRV8Q8@0-kICHbm|qud|`fm7S*atmp?Ddcwn&W;igLC z11qDR-`Oo9`0~5qPqAs6{>yz4hvi;K=`!i&shAvKj>raLJtA{PK~a7|YEemMYH@Ix z|5@jQ!Rt)0fkCLjhAl>>TZ~Ks3;6f~4U7!7JkWv` zP^MRmFYtaV=HdAEf&ZbG{waOk4?Y`x&z-;OeNO+>=`-HXy>zrr`gr^3F>;AN7oS?d z2rP9NnM9az7oR}K1Azd;TSpL$RG7lFVJ}WWia}sWBTB)5RJh`^7*yavfB?h)|Hpw$ zxW%yI4`w~~0uZ733#Mk&;t;n%3J_C(B*+!Ij2Ny!HV9fg!c4_z&nLTUHPc0Pnkf^#A|> From d4f8ed5526c3717279a239536853bc86d2020090 Mon Sep 17 00:00:00 2001 From: qrqhuangcy Date: Mon, 4 May 2020 04:14:33 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=8E=BB=E9=99=A4java=E4=B8=AD=E6=97=A0?= =?UTF-8?q?=E6=84=8F=E4=B9=89=E7=9A=84=E6=95=B0=E7=BB=84=E6=8B=B7=E8=B4=9D?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/java/main/BubbleSort.java | 5 +---- src/java/main/BucketSort.java | 5 +---- src/java/main/CountingSort.java | 5 +---- src/java/main/HeapSort.java | 5 +---- src/java/main/InsertSort.java | 5 +---- src/java/main/MergeSort.java | 5 +---- src/java/main/QuickSort.java | 5 +---- src/java/main/RadixSort.java | 5 +---- src/java/main/SelectionSort.java | 4 +--- src/java/main/ShellSort.java | 7 +------ 10 files changed, 10 insertions(+), 41 deletions(-) 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..016ba23 100644 --- a/src/java/main/MergeSort.java +++ b/src/java/main/MergeSort.java @@ -6,10 +6,7 @@ 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 { if (arr.length < 2) { return arr; } 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; From 6720ed96ac872d80ebc86f4a27de4bbafca23cd3 Mon Sep 17 00:00:00 2001 From: qrqhuangcy Date: Mon, 4 May 2020 04:14:57 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3maven=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/java/pom.xml | 3 +++ 1 file changed, 3 insertions(+) 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 From 917f24df3661bc8cc57f3064a0fba72e401aece7 Mon Sep 17 00:00:00 2001 From: qrqhuangcy Date: Mon, 4 May 2020 04:25:41 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=87=8D=E5=86=99java=E7=89=88=E5=BD=92?= =?UTF-8?q?=E5=B9=B6=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 5.mergeSort.md | 63 ++++++++++++++++-------------- src/java/main/MergeSort.java | 66 ++++++++++++++++++-------------- src/java/test/ArraySortTest.java | 7 ---- 3 files changed, 71 insertions(+), 65 deletions(-) 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/MergeSort.java b/src/java/main/MergeSort.java index 016ba23..bed6cf0 100644 --- a/src/java/main/MergeSort.java +++ b/src/java/main/MergeSort.java @@ -1,47 +1,55 @@ -import java.util.Arrays; - /** * 归并排序 + * @author qrqhuangcy + * @date 2020/5/4 */ public class MergeSort implements IArraySort { @Override public int[] sort(int[] arr) throws Exception { - if (arr.length < 2) { - return arr; + mergeSort(arr, 0, arr.length - 1); + 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/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));