【发布时间】:2023-07-19 10:53:02
【问题描述】:
这是来自 Java 编程简介中关于合并排序的代码。此方法使用递归实现。
public class MergeSort {
2 /** The method for sorting the numbers */
3 public static void mergeSort(int[] list) {
4 if (list.length > 1) {
5 // Merge sort the first half
6 int[] firstHalf = new int[list.length / 2];
7 System.arraycopy(list, 0, firstHalf, 0, list.length / 2);
8 mergeSort(firstHalf);
9
10 // Merge sort the second half
11 int secondHalfLength = list.length - list.length / 2;
12 int[] secondHalf = new int[secondHalfLength];
13 System.arraycopy(list, list.length / 2,
14 secondHalf, 0, secondHalfLength);
15 mergeSort(secondHalf);
16
17 // Merge firstHalf with secondHalf into list
18 merge(firstHalf, secondHalf, list);
19 }
20 }
我的问题:是在第 8 行将递归方法调用回“mergeSort”吗?如果从方法的开头运行,将再次创建“firstHalf”数组,长度将减半。我认为“firstHalf”不能再次创建,如果已经定义了数组,则不应更改长度。
这里是完整的代码链接:Merge Sort Java。
【问题讨论】:
-
firstHalf将被再次创建,因为它属于(list.length > 1)的范围,因此每次使用MergeSort调用list.length > 1,您都会得到另一个int[] firstHalf。那是你的问题还是? -
我鼓励你看看这个链接algs4.cs.princeton.edu/22mergesort