Java分治归并排序算法实例详解
什么是分治归并排序算法
分治法是一种算法解决问题的思想,即将一个问题分成若干个小问题,再将小问题分成更小的子问题,直到最后子问题可以很容易地直接求解,原问题的解即子问题的解的合并。归并排序算法采用了分治法思想,将一个要排序的数组分成两个小数组,再将这两个小数组分别排序,最终合并两个有序小数组成为一个有序大数组。
算法流程
分治法的流程如下:
- 将问题划分为规模较小的子问题
- 递归地求解每个子问题
- 将子问题的解进行合并得到原问题的解
由于排序算法的本质是比较,所以归并排序在合并两个有序数组的时候非常高效,只需要按照顺序比较两个数组的元素即可。归并排序算法的流程如下:
- 将数组拆分成两个子数组
- 对每个子数组进行递归排序
- 将两个已排序子数组合并成为一个有序数组
下面通过示例代码进行详解。
示例说明
以下是Java实现归并排序算法的示例代码:
public class MergeSort {
public void sort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
sort(arr, left, mid);
sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
private void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1;
int index = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[index++] = arr[i++];
} else {
temp[index++] = arr[j++];
}
}
while (i <= mid) {
temp[index++] = arr[i++];
}
while (j <= right) {
temp[index++] = arr[j++];
}
for (int k = 0; k < temp.length; k++) {
arr[left + k] = temp[k];
}
}
}
sort()方法是排序算法中的主要方法,它接受一个要排序的数组、数组起始下标left和结束下标right,通过递归调用自身来分割数组并进行排序,最终调用merge()方法合并两个有序子数组。
merge()方法接受一个数组、两个分割点mid和right,将arr[left...mid]和arr[mid+1...right]两个有序子数组合并成为一个有序数组。
下面以示例数组{38, 27, 43, 3, 9, 82, 10}为例,演示该算法的执行过程。
- 初始时left=0,right=6,mid=3
- 调用sort(arr, left = 0, mid = 3),sort(arr, mid + 1 = 4, right = 6)
- 再次调用sort(arr, left = 0, mid = 1),sort(arr, mid + 1 = 2, mid = 3)
- 可以发现当left=2,right=3时,数组{27, 38}已经有序,不需要再次排序
- 再次调用merge(arr, left = 0, mid = 1, right = 3),可以发现数组arr已经排好序为{3, 9, 27, 38, 43, 82, 10},但是10的位置错误
- 再次调用sort(arr, left = 2, right = 3)和sort(arr, left = 4, right = 6)
- 对于{10, 82},已经有序,再次调用merge(arr, left = 2, mid = 2, right = 3)进行合并
- 对于数组{3, 9, 10, 27, 38, 43, 82},已有序,算法结束
总结
归并排序是一种利用分治思想的高效排序算法,具有稳定性和高效性。Java中的实现方法简单,代码可读性较好,适用于大多数场景,是常见的排序算法之一。通过对算法流程和示例的分析,可以更好地了解归并排序算法的具体实现过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java分治归并排序算法实例详解 - Python技术站