用分治算法求自顶向下的二路归并排序,java代码
时间: 2024-10-13 09:13:07 浏览: 22
Java经典排序算法之归并排序详解
自顶向下二路归并排序是一种利用分治策略的排序算法,它通过将数组分为两个相等或接近相等的部分,然后递归地对每个部分进行排序,最后合并这两个有序的部分得到整个数组的有序序列。以下是使用 Java 实现的简单版本:
```java
public class MergeSort {
// 分治函数,传入待排序数组的起始和结束索引
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
// 找到中间位置
int mid = (left + right) / 2;
// 递归对左半部分和右半部分进行排序
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
// 合并左右两个已排序的部分
merge(arr, left, mid, right);
}
}
// 合并两个已排序的部分
private static void merge(int[] arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
// 创建临时数组存储结果
int[] temp = new int[n1 + n2];
int i = 0, j = 0, k = 0;
// 比较左边、右边部分的元素并按顺序放入临时数组
while (i < n1 && j < n2) {
if (arr[left + i] <= arr[mid + 1 + j]) {
temp[k++] = arr[left + i++];
} else {
temp[k++] = arr[mid + 1 + j++];
}
}
// 将剩余未比较的元素复制到临时数组
while (i < n1) {
temp[k++] = arr[left + i++];
}
while (j < n2) {
temp[k++] = arr[mid + 1 + j++];
}
// 将临时数组的内容回填到原数组
for (i = left; i <= right; i++) {
arr[i] = temp[i - left];
}
}
// 示例使用
public static void main(String[] args) {
int[] arr = {9, 7, 5, 11, 12, 2, 14, 3};
int arrayLength = arr.length;
mergeSort(arr, 0, arrayLength - 1);
System.out.println("Sorted array: ");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
```
阅读全文