归并算法,可以拆分成 递归和合并
首先简单来说就是将一个数组,拆分成两个数组,利用递归,无限的拆分到不能拆分为止,然后在两两的进行合并,最终形成一个完整的有序数组
而java中是使用了变量来充当指针进行移动,将选中数组中的数保存到临时数组中,最后复制到原数组中
public class MergeSort_owner {
//方法入口
public static void sort(int[] arr) {
//左指针
int left = 0;
//右指针
int right = arr.length - 1;
//临时变量数组
int[] temp = new int[arr.length];
//调用归并排序
sortMerge(arr, left, right, temp);
}
public static void sortMerge(int[] arr, int left, int right, int[] temp) {
int mid = (left + right) / 2;//中间值
if (left < right) {//递归结束条件
sortMerge(arr, left, mid, temp);//将数组左边按照从小到大顺序排列
sortMerge(arr, mid + 1, right, temp);//将数组右边按照从小到大顺序排列
merge(arr, left, mid, right, temp);//两个数组合并到一起
}
}
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;//临时左指针
int j = mid + 1;//临时右指针
int k = 0;//临时数组的变量
while (i <= mid && j <= right) {//当左边小于中间,中间的小于右边,才合理进行存放
if (arr[i] <= arr[j]) {//左边的小于右边,将左边放到临时数组中
temp[k++] = arr[i++];
} else {//反之,右边的放到数组中
temp[k++] = arr[j++];
}
}
while (i <= mid) {//将剩余的数组放到临时数组中
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
k = 0;
//将temp中的元素全部拷贝到原数组中
while (left <= right) {
arr[left++] = temp[k++];
}
}
}