gpt4 book ai didi

java - 如何修复 Java 中的合并排序算法并从函数返回排序数组

转载 作者:行者123 更新时间:2023-12-04 09:42:37 24 4
gpt4 key购买 nike

我在 Java 中实现合并排序算法时遇到问题:我已经完成了合并排序算法,但它无法产生正确的结果。我还从函数返回排序列表。我怎样才能做到?

这是我在下面定义的合并排序算法。

归并排序方法:

public static void mergeSort(ArrayList<Person> personList, Comparator<Person> compTr) {
ArrayList<Person> helper = new ArrayList<Person>();
mergeSort(personList, helper, 0, personList.size() - 1, compTr);
}

归并排序功能:
private static void mergeSort(ArrayList<Person> list, 
ArrayList<Person> helper,
int low,
int high,
Comparator<Person> compTr) {
if (low < high) {
int middle = (low + high) / 2;
mergeSort(list, helper, low, middle, compTr); //sort left half
mergeSort(list, helper, middle + 1, high, compTr); //sort right half
merge(list, helper, low, middle, high, compTr); // merge
}
}

合并算法:
private static void merge(ArrayList<Person> list, 
ArrayList<Person> helper,
int low,
int middle,
int high,
Comparator<Person> compTr) {
//This loop throws Exception
for (int i = low; i < high + 1; i++) {
helper.add(i, list.get(i));
}

int helperLeft = low;
int helperRight = middle + 1;
int current = low;

while (helperLeft < middle && helperRight < high) {
if (isGreaterThan(helper.get(helperLeft), helper.get(helperRight), compTr)) {
list.set(current, helper.get(helperLeft));
helperLeft++;
} else {
list.set(current, helper.get(helperRight));
helperRight++;
}
current++;
}

//Copy remaining elements
int remaining = middle - helperLeft;
for (int j = 0; j <= remaining; j++) {
list.set(current + j, helper.get(helperLeft + j));
}

// RETURN LIST(list) _-> TO DO
}

实现比较器功能
public static boolean isGreaterThan(Person helperLeft, Person helperRight, Comparator<Person> compTr) {
return greaterThan(compTr, helperLeft, helperRight);
}

private static boolean greaterThan(Comparator comp, Person x, Person y) {
return comp.compare(x, y) > 0;
}

我怎样才能做到这一点?

最佳答案

I couldn't get a return value as a list from merge function



如果我理解正确,您正在寻找一种返回排序列表的方法。但是在您的实现中,您正在尝试对原始列表进行排序。
这意味着您在调用合并函数时已经有一个指向结果排序列表的变量:调用时用作参数的变量
public static void mergeSort(ArrayList<Person> personList, Comparator<Person> compTr)

例如,如果您在名为“list”的 ArrayList 中有您的人,则您正在对这个“列表”进行排序。
    ArrayList<Person> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new Person());
}
System.out.println(list);
mergeSort(list, Comparator.<Person>naturalOrder());
System.out.println(list);

有关更多信息,您正在使用的称为 inout 参数 - 就像您为函数提供输入并通过此参数接收其输出一样。

正如评论中所指出的,代码也存在其他问题。我怀疑这里有一个错误(<= 而不是 <)
(helperRight <= high)


另一个是您在就地合并排序中使用了临时列表。

在这里可以找到一个工作示例:
How to sort in-place using the merge sort algorithm?

关于java - 如何修复 Java 中的合并排序算法并从函数返回排序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62261280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com