From 401a3caf82994aa9273e655762455d892ec6af95 Mon Sep 17 00:00:00 2001
From: qrqhuangcy <qrqhuangcy@hotmail.com>
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<audr^^WdJrR4k3DI5|I8FFC&`FEcM4
zk46Rj8jJIbO5nOV82lSmd|G(oL#{G0Fz5ioS)B;o1weOH<mT)Rb<7ra6xsJYe9gh&
z#PmsFA*a%^E_OL(b9X)}y*qbFaC!Q)nKxBjZ8}8wuP#br&2N%p;kWJ3(D;=;%j_Sw
zy7BJWcb9ldu@v9>`>gtX?fco^&CYq5^Q<v@)?^T+9qza^C-Ifx{0m`gYql3&-WL_;
zsH*-bhrRkzP>xpC(_GEPsT|JRdo>G`uirk_@KNl}tve0V9b8j2BVYQr>y)#eJY+SO
z?}g6GhNE6fx!&imxgOefVJoNTrKNJ`+POFBe0gd0Ic8<*Ih}mpq>|Qrhv?4@Rr<=Y
zXE<l}H&-9yT;eYqalotX`Ximbyx%916+cKUKc&gOY{9}EF_V_P_GINawv@TJAyK7I
zIdw<u{>{5W_iw#fkYK$!CBiQ6af2(D>r6%Gf{x5NyA<87_b#aNkzLWK<i68`Y03&Q
z!@Xg9_bi#kA)DdX^=1aUMtSOC17RZzxl>KbyNVi4NChP?xu<&YXWOKkO#DegKO8p9
zsIJhR>A1xGLSwLHWxkS6t?7Z?3SWzAw{8r}=eg1&t7`Rmk=IcZ*M)~gl--tY-!B}j
z<ld&J{4`DBVXvR7n=flzjmf%Sg?T<)j)#JC6*^l_<;>%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<NcFC9<cK#x@+AAEJZ&pr++(>@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<nK*9`M(wI$zY0%;l
k5m4CE7Q)b07Q#*h8Hz}00p6@^ApPt>_z&nLTUHPc0Pnkf^#A|>


From d4f8ed5526c3717279a239536853bc86d2020090 Mon Sep 17 00:00:00 2001
From: qrqhuangcy <qrqhuangcy@hotmail.com>
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 <qrqhuangcy@hotmail.com>
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 @@
     </dependencies>
 
     <build>
+        <sourceDirectory>main</sourceDirectory>
+        <testSourceDirectory>test</testSourceDirectory>
+
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>

From 917f24df3661bc8cc57f3064a0fba72e401aece7 Mon Sep 17 00:00:00 2001
From: qrqhuangcy <qrqhuangcy@hotmail.com>
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));