📅  最后修改于: 2023-12-03 15:27:10.596000             🧑  作者: Mango
合并排序是一种基于分治策略的排序算法,也是比较高效的排序算法之一。它将一个待排序数组分成两个较小的子数组,然后对这两个子数组进行排序,最后将两个有序子数组合并成一个有序数组。
下面我们来介绍一个用Java实现的合并排序算法程序。
public class MergeSort {
public static void sort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int[] aux = new int[arr.length];
sort(arr, aux, 0, arr.length - 1);
}
private static void sort(int[] arr, int[] aux, int lo, int hi) {
if (lo >= hi) {
return;
}
int mid = lo + (hi - lo) / 2;
sort(arr, aux, lo, mid);
sort(arr, aux, mid + 1, hi);
merge(arr, aux, lo, mid, hi);
}
private static void merge(int[] arr, int[] aux, int lo, int mid, int hi) {
for (int i = lo; i <= hi; i++) {
aux[i] = arr[i];
}
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
if (i > mid) {
arr[k] = aux[j++];
} else if (j > hi) {
arr[k] = aux[i++];
} else if (aux[j] < aux[i]) {
arr[k] = aux[j++];
} else {
arr[k] = aux[i++];
}
}
}
}
上述程序定义了一个名为MergeSort
的类,其中包含了一个名为sort
的公共静态方法。该方法用于对指定的整型数组进行排序。
首先,程序会对输入数组进行判断,如果数组为空或长度为1,则直接返回。接着,程序会创建一个辅助数组aux
,用于在排序过程中存储中间结果。然后调用私有方法sort
,对整个数组进行排序。
在私有方法sort
中,程序首先判断lo
是否大于等于hi
,如果是则返回。然后计算中间位置mid
,将数组分为两部分。接着递归调用sort
方法,对左半部分和右半部分分别进行排序,并将结果合并到aux
数组中。最后调用merge
方法,将aux
数组中的数据合并回原始数组arr
中。
在私有方法merge
中,程序先将arr
数组中需要排序的部分赋值到aux
数组中。接着,定义三个指针i
、j
、k
,分别指向左半部分的第一个元素,右半部分的第一个元素,和当前需要排序的位置。然后比较aux[j]
和aux[i]
的大小关系,将较小的数值放入arr[k]
中,并将指针向后移动。
最后,我们可以使用如下代码来测试上述程序:
public class Main {
public static void main(String[] args) {
int[] arr = { 5, 12, 8, 15, 10, 6, 1, 9 };
MergeSort.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
运行上述代码,程序会输出排序后的结果:
[1, 5, 6, 8, 9, 10, 12, 15]
总之,Java合并排序程序是一种高效的排序算法,可以有效地对一般规模的数据进行排序。使用上述程序,我们可以轻松地实现合并排序算法,并对大量数据进行排序。