实现原理:
1.分解:将原始数组不断分解,直到每个子数组只包含一个元素,即每个子数组都是有序的。
2.合并:将两个有序的子数组合并成一个新的有序数组。
3.递归:这个过程是递归进行的,即合并后的有序数组再次被分解,然后继续合并。
4.重复合并:重复上述分解和合并的过程,直到原始数组被完全合并成一个有序数组。
package 八大排序;
import java.util.Arrays;
//归并排序
public class MergeSort {
public static void main(String[] args) {
int[] arr = {12, 11, 13, 5, 6, 7,-11,4,43,32,0,1};
mergeSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
// 归并排序的递归函数
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
// 找到中间索引
int middle = (left + right) / 2;
// 分别对左右两半进行排序
mergeSort(arr, left, middle);
mergeSort(arr, middle + 1, right);
// 合并排序好的两半
merge(arr, left, middle, right);
}
}
// 合并两个子数组的函数
public static void merge(int[] arr, int left, int middle, int right) {
// 临时数组
int[] temp = new int[right - left + 1];
// 索引初始化
int i = left; // 左半部分的起始索引
int j = middle + 1; // 右半部分的起始索引
int k = 0; // 临时数组的索引
// 合并过程
while (i <= middle && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
// 复制剩余的元素到临时数组
while (i <= middle) {
temp[k++] = arr[i++];
}
// 复制剩余的元素到临时数组
while (j <= right) {
temp[k++] = arr[j++];
}
// 将临时数组的元素复制回原数组
for (k = 0, i = left; i <= right; i++, k++) {
arr[i] = temp[k];
}
}
// 打印数组的函数
}