给定一个整数序列,请按非递减序输出采用二路归并排序(递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。 输出格式: 对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。 输入样例: 6 73 12 27 98 81 64 输出样例: 12 73 27 98 81 64 12 27 73 98 81 64 12 27 73 81 98 64 12 27 73 64 81 98 12 27 64 73 81 98帮我用java完成这道编程
时间: 2024-03-23 08:42:27 浏览: 56
好的,这道题可以使用递归的方式来实现二路归并排序,以下是Java代码实现:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
mergeSort(nums, 0, n - 1);
}
}
private static void mergeSort(int[] nums, int left, int right) {
if (left >= right) {
return;
}
int mid = (left + right) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
print(nums, left, right);
}
private static void merge(int[] nums, int left, int mid, int right) {
int[] temp = new int[nums.length];
int i = left, j = mid + 1, k = left;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
}
while (i <= mid) {
temp[k++] = nums[i++];
}
while (j <= right) {
temp[k++] = nums[j++];
}
for (i = left; i <= right; i++) {
nums[i] = temp[i];
}
}
private static void print(int[] nums, int left, int right) {
for (int i = left; i <= right; i++) {
System.out.print(nums[i] + " ");
}
System.out.println();
}
}
```
解释一下代码:
1. 首先读入测试数据,对于每组测试数据,我们使用 `mergeSort` 方法进行排序。
2. `mergeSort` 方法采用递归的方式进行二路归并排序,先将左半边和右半边分别排序,然后再将两部分归并起来,完成一次排序。在归并操作完成后,我们调用 `print` 方法输出当前排序后的结果。
3. `merge` 方法是归并操作的具体实现,我们使用 `temp` 数组来存储归并后的结果,然后将 `temp` 中的元素复制回原数组中,完成归并操作。
4. `print` 方法用来输出当前排序后的结果,注意要输出从 `left` 到 `right` 区间的元素。
希望对你有所帮助!
阅读全文