Java函数实现归并排序的完整步骤。
发布时间:2023-06-09 19:04:41
归并排序,是一种典型的基于分治思想和递归实现的排序算法。它的基本思想是将待排序的序列划分为若干个子序列,对每个子序列进行排序,然后将排好序的子序列合并,最终完成整个序列的排序。下面我们就来讲一讲如何用Java函数实现归并排序。
1. 实现归并函数
归并函数是归并排序的核心函数,它负责将两个有序子串合并成一个有序序列。具体实现如下:
public static int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0, j = 0, k = 0;
while (i < left.length && j < right.length) {
result[k++] = left[i] < right[j] ? left[i++] : right[j++];
}
while (i < left.length) {
result[k++] = left[i++];
}
while (j < right.length) {
result[k++] = right[j++];
}
return result;
}
这个函数接收两个有序子数组left和right,返回它们合并成的有序数组result。在函数中,我们使用三个指针i、j和k来追踪left、right和result数组的位置,并依次比较left[i]和right[j]的大小关系,将较小值放入result[k]中。如果其中一个数组遍历完了,我们就直接将另一个数组的剩余元素复制到result数组中。
2. 实现分治函数
分治函数是主要函数,它首先将待排序的序列不断拆分,直到每个子序列只剩下一个元素,然后逐层进行归并操作,最终返回排序好的序列。具体实现如下:
public static int[] mergeSort(int[] arr) {
if (arr.length <= 1) {
return arr;
}
int mid = arr.length / 2;
int[] left = new int[mid];
int[] right = new int[arr.length - mid];
for (int i = 0; i < mid; i++) {
left[i] = arr[i];
}
for (int i = mid; i < arr.length; i++) {
right[i - mid] = arr[i];
}
return merge(mergeSort(left), mergeSort(right));
}
这个函数接收待排序的数组arr,首先进行基线检查,如果它的长度小于等于1,直接返回它本身。否则,将数组拆分成长度为mid和arr.length-mid的left和right两个子数组,然后不断递归地调用mergeSort函数对left和right进行归并排序,最后返回合并后的结果。
3. 主函数测试
将merge和mergeSort函数放在一起,对一个随机生成的大小为10的数组进行排序:
public static void main(String[] args) {
int[] arr = {5, 4, 2, 7, 8, 3, 1, 9, 6, 0};
int[] sorted = mergeSort(arr);
System.out.println(Arrays.toString(sorted));
}
输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
这表明我们成功地使用归并排序对数组进行了排序。
归并排序的时间复杂度为O(nlogn),它对数组的初始状态没有要求,稳定性好,所以在实际应用中广泛使用。
