// 归并排序的基本思想是分治
// 将数组分成两个部分,然后将左右数组按大小进行排序并返回新的数组
// 归并方法用用到了递归,终止递归的条件是当数组只有一个元素的时候停止
// 为了标记左右数组需要两个指针分别记录做数组的起始位置和右数组的起始位置
// 实际上只要知道数组最右面值的下标也可以获取到右数组的起始位置,所以只需要传入数组的起始位置和末尾位置即可
public static int[] mergeSort(int[] arr, int left, int right) {
//递归的终止条件当起始下标等于末尾下标的时候说明只剩下一个元素
//此时停止递归并将该元素返回
if(left == right) {
return new int[] {arr[left]};
}
int L = left; // 左数组的起始位置
int M = (left + right) / 2; // 左数组的末尾位置
int[] leftArr = mergeSort(arr, L, M); //左数组递归使左数组有序
int[] rightArr = mergeSort(arr, M + 1, right); //右数组递归使右数组有序
int[] newArr = new int[leftArr.length + rightArr.length]; //创建新的数组用来存放左数组和右数组
int m = 0, j = 0, i = 0; //m指针指向newArr数组 j指针指向右数组 i指针指向左数组
while (i < leftArr.length && j < rightArr.length) {
//将两个数组按大小放入到新数组中只到左数组或者右数组中的任意一个数组全部放到新数组中为止
newArr[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];
}
//如果左数组中还有剩余的元素就将剩余的元素全部放到新数组中
while(i < leftArr.length) {
newArr[m++] = leftArr[i++];
}
//如果右数组中还有剩余的元素就将剩余的元素全部放到新数组中
while(j < rightArr.length) {
newArr[m++] = rightArr[j++];
}
return newArr;
}
实现归并排序java(分治与递归)
最新推荐文章于 2022-05-19 17:02:49 发布