我很乐意为您详细讲解“排序算法图解之Java归并排序的实现”的完整攻略。
算法概述
归并排序(Merge Sort)是一种比较常见的排序算法,它采用了分治策略,将要排序的数组分成若干个子问题,先解决子问题,再合并子问题的结果得到最终结果。
具体实现,就是将数组不断地拆分成两个子数组,直到子数组中只有一个元素,然后再将有序的子数组合并成一个大的有序数组。
实现过程
归并排序的实现过程可以分为以下几步:
- 递归划分子问题:将待排序数组拆分为若干个子数组,直到子数组的长度为1,每个子数组都是有序的。
- 合并子问题解:将两个有序子数组合并成一个有序数组。
在代码中,可以定义一个 mergeSort
函数,用于递归划分子问题,并调用 merge
函数进行合并。
public static void mergeSort(int[] arr, int leftIndex, int rightIndex) {
if (leftIndex >= rightIndex) {
return;
}
int mid = (leftIndex + rightIndex) / 2;
mergeSort(arr, leftIndex, mid);
mergeSort(arr, mid + 1, rightIndex);
merge(arr, leftIndex, mid, rightIndex);
}
其中 leftIndex
和 rightIndex
分别表示待排序数组中左右区间的起始和结束下标。
递归过程中,首先判断 leftIndex
和 rightIndex
是否相等,如果相等,则直接返回,否则将待排序数组递归拆分为左右两个子数组,直到子数组中只有一个元素。
接下来,可以定义一个 merge
函数,用于合并两个有序子数组。
public static void merge(int[] arr, int leftIndex, int mid, int rightIndex) {
int[] tmp = new int[arr.length];
int left = leftIndex;
int right = mid + 1;
int t = 0;
while (left <= mid && right <= rightIndex) {
if (arr[left] <= arr[right]) {
tmp[t++] = arr[left++];
} else {
tmp[t++] = arr[right++];
}
}
while (left <= mid) {
tmp[t++] = arr[left++];
}
while (right <= rightIndex) {
tmp[t++] = arr[right++];
}
t = 0;
while (leftIndex <= rightIndex) {
arr[leftIndex++] = tmp[t++];
}
}
其中,leftIndex
和 rightIndex
是待排序数组的起始和结束下标,mid
是中间位置下标。
在函数中,定义一个 tmp
数组,用于存放合并后的结果。然后,定义 left
和 right
指针分别指向左子数组和右子数组的第一个元素,依次将两个子数组中较小的元素存放到 tmp
数组中。最后,将 tmp
数组中的数据复制到待排序数组相应的位置上,完成合并。
示例说明
为了更好地理解归并排序,以下举两个示例来说明。
示例一
假设有一个长度为5的待排序数组:[5, 2, 4, 7, 1]
。
首先将数组拆分为两个子数组:[5, 2, 4]
和 [7, 1]
。然后,分别对两个子数组进行排序,最终得到有序子数组:[2, 4, 5]
和 [1, 7]
。
接下来,将两个有序子数组合并成一个有序数组。首先将两个有序子数组的第一个元素进行比较,较小的存放到 tmp
数组中,然后将对应的指针向后移动一位,继续比较,直到其中一个子数组全部存放到了 tmp
数组中。最后,将剩余的元素存放到 tmp
数组中,再将 tmp
数组中的元素复制到原数组中。
最终,得到有序数组:[1, 2, 4, 5, 7]
。
示例二
假设有一个长度为10的待排序数组:[7, 2, 8, 4, 1, 9, 6, 3, 10, 5]
。
首先将数组拆分为两个子数组:[7, 2, 8, 4, 1]
和 [9, 6, 3, 10, 5]
。然后,分别对两个子数组进行排序。对第一个子数组,重复以上步骤,将其拆分为两个子数组:[7, 2]
和 [8, 4, 1]
,然后对两个子数组进行排序,得到有序子数组:[2, 7]
和 [1, 4, 8]
,最后将两个有序子数组合并成一个有序数组:[1, 2, 4, 7, 8]
。对第二个子数组,重复以上步骤,最终得到有序子数组:[3, 5, 6, 9, 10]
。
接下来,将两个有序子数组合并成一个有序数组,得到有序数组:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。
总结
归并排序是一种非常常用的排序算法,它采用分治策略,将待排序数组不断拆分为子问题,直到子问题中只有一个元素,然后再将有序的子数组合并成一个大的有序数组。归并排序的时间复杂度为 $O(n\log n)$,是一种稳定的排序算法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:排序算法图解之Java归并排序的实现 - Python技术站