大家好,我是锋哥。今天分享关于【Java实现归并排序算法】**面试题。**希望对大家有帮助;
Java实现归并排序算法
下面是一个用 Java 实现的归并排序算法:
public class MergeSort {
public static void main(String[] args) {
int[] arr = { 12, 7, 5, 14, 3, 8, 1, 9, 6, 11 };
System.out.println("原数组:");
printArray(arr);
mergeSort(arr, 0, arr.length - 1);
System.out.println("排序后数组:");
printArray(arr);
}
// 归并排序函数
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
// 找到中点
int mid = left + (right - left) / 2;
// 递归分治排序
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
// 合并两个已排序的子数组
merge(arr, left, mid, right);
}
}
// 合并两个已排序的子数组
public static void merge(int[] arr, int left, int mid, int right) {
// 找到两个子数组的大小
int n1 = mid - left + 1;
int n2 = right - mid;
// 创建临时数组
int[] leftArr = new int[n1];
int[] rightArr = new int[n2];
// 将数据拷贝到临时数组
System.arraycopy(arr, left, leftArr, 0, n1);
System.arraycopy(arr, mid + 1, rightArr, 0, n2);
// 合并两个临时数组
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
// 如果左边的数组还有剩余,拷贝到原数组
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
// 如果右边的数组还有剩余,拷贝到原数组
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
// 打印数组
public static void printArray(int[] arr) {
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
}
}
说明:
-
归并排序的基本思路:
- 归并排序是一种"分治法"算法。它通过将一个大数组不断分成两半,直到每个子数组只有一个元素,然后再逐步将它们合并成一个有序数组。
- 归并排序的关键是"合并"操作,它将两个已经排序的数组合并成一个新的排序数组。
-
mergeSort()
:这是递归函数,首先将数组从中间分割成两半,然后对每半部分递归进行排序,最后合并这两个已经排序的部分。 -
merge()
:负责合并两个已经排序的子数组。在合并过程中,通过比较左边数组和右边数组的元素,将较小的元素放入原数组中。若其中一边的数组先耗尽,则直接将另一边的剩余元素复制到原数组中。 -
printArray()
:打印数组,便于展示排序前后的效果。
运行效果:
- 程序会先打印出原数组,然后通过归并排序将其排序,再打印出排序后的数组。
归并排序的时间复杂度为 O(n log n),它是一种稳定的排序算法,适用于大数据集的排序。