每當看到簡潔的代碼時,我都一頭霧水,,,只好先翻譯成我能理解的幼兒園水平。
放一個超級好理解的博主的講解
https://www.cnblogs.com/chengxiao/p/6194356.html
遞歸+分治
package sort;
import com.sun.xml.internal.fastinfoset.util.CharArrayIntMap;
public class MergeSortTest {
private static void mergeSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int[] newArray = new int[arr.length];
mergeSort(arr, 0, arr.length - 1, newArray);
}
private static void mergeSort(int[] arr, int left, int right, int[] newArray) {
//base case 遞歸終止條件
if (left >= right) {
return;
}
//分
//防止越界
int mid = left + (right - left) / 2;
//治
mergeSort(arr, left, mid, newArray);
mergeSort(arr, mid + 1, right, newArray);
//輔助的Array
for (int i = left; i <= right; i++) {
newArray[i] = arr[i];
}
//合
int i = left;
int j = mid + 1;
int k = left;
/*要注意,這裏的等於號跟哪邊,會影響這個排序算法的穩定性。指針 i 指的是左邊的元素,遇到相等的元素也會先拷貝下來,所以左邊的元素一直在左邊,維持了相對順序,所以就是穩定的。*/
while (i <= mid && j <= right) {
if (newArray[i] <= newArray[j]) {
arr[k] = newArray[i];
//一起向右走
k++;
i++;
} else if (newArray[i] > newArray[j]) {
arr[k] = arr[j];
k++;
j++;
}
}
//和上面對應
while (i <= mid) {
arr[k++] = newArray[i++];
}
}
public static void main(String[] args) {
int[] a = {3, 4, 5, 8, 2, 9, 1};
mergeSort(a);
for (int i : a) {
System.out.println(i);
}
}
}
package sort;
import com.sun.xml.internal.fastinfoset.util.CharArrayIntMap;
public class MergeSortTest {
private static void mergeSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int[] newArray = new int[arr.length];
mergeSort(arr, 0, arr.length - 1, newArray);
}
private static void mergeSort(int[] arr, int left, int right, int[] newArray) {
//base case 遞歸終止條件
if (left >= right) {
return;
}
//分
//防止越界
int mid = left + (right - left) / 2;
//治
mergeSort(arr, left, mid, newArray);
mergeSort(arr, mid + 1, right, newArray);
//輔助的Array
for (int i = left; i <= right; i++) {
newArray[i] = arr[i];
}
//合
int i = left;
int j = mid + 1;
int k = left;
/*要注意,這裏的等於號跟哪邊,會影響這個排序算法的穩定性。不清楚穩定性的同學快去翻一下上一篇文章啦~
那像我代碼中這種寫法,指針 i 指的是左邊的元素,遇到相等的元素也會先拷貝下來,所以左邊的元素一直在左邊,維持了相對順序,所以就是穩定的。*/
while (i <= mid && j <= right) {
if (newArray[i] <= newArray[j]) {
arr[k++] = newArray[i];
//一起向右走
/* k++;
i++;*/
} else if (newArray[i] > newArray[j]) {
arr[k++] = arr[j++];
/* k++;
j++;*/
}
}
//和上面對應
while (i <= mid) {
arr[k++] = newArray[i++];
}
}
public static void main(String[] args) {
int[] a = {3, 4, 5, 8, 2, 9, 1};
mergeSort(a);
for (int i : a) {
System.out.println(i);
}
}
}