Java 合并排序算法错误
嘿,我一直在用Eclipse中的java开发一个合并分类器应用程序。由于某种原因我无法理解,这让我很生气 这是我正在使用的主文件Java 合并排序算法错误,java,eclipse,mergesort,Java,Eclipse,Mergesort,嘿,我一直在用Eclipse中的java开发一个合并分类器应用程序。由于某种原因我无法理解,这让我很生气 这是我正在使用的主文件 public class MergeSorter { public Integer[] sort(Integer[] array) { return mergesort(array); } private Integer[] mergesort(Integer[] array) { if(array.lengt
public class MergeSorter {
public Integer[] sort(Integer[] array) {
return mergesort(array);
}
private Integer[] mergesort(Integer[] array) {
if(array.length > 1) {
Integer[] left = new Integer[array.length /2];
Integer[] right = new Integer[array.length - left.length];
mergesort(left);
mergesort(right);
merge(left, right);
}
return array;
}
public Integer[] merge(Integer[] left, Integer[] right) {
int leftI = 0;
int rightI = 0;
int newI = 0;
Integer[] newArr = new Integer[left.length + right.length];
while (leftI < left.length && rightI < right.length) {
if (left[leftI] < right[rightI]) {
newArr[newI] = left[leftI];
leftI++;
} else {
newArr[newI] = right[rightI];
rightI++;
}
newI++;
}
// Either the left or the right may still have elements
for (int i = leftI; i < left.length; i++) { // left
newArr[newI] = left[i];
newI++;
}
for (int i = rightI; i < right.length; i++) { // right
newArr[newI] = right[i];
newI++;
}
return newArr;
}
public void printCollection(Integer[] items) {
for (int i = 0; i < items.length; i++) {
System.out.print(items[i] + " ");
}
System.out.println();
}
}
公共类合并分类器{
公共整数[]排序(整数[]数组){
返回合并排序(数组);
}
私有整数[]合并排序(整数[]数组){
如果(array.length>1){
整数[]左=新整数[array.length/2];
整数[]右=新整数[array.length-left.length];
合并排序(左);
合并排序(右);
合并(左、右);
}
返回数组;
}
公共整数[]合并(左整数[],右整数[]){
int-leftI=0;
int rightI=0;
int-newI=0;
整数[]newArr=新整数[left.length+right.length];
while(leftI
还有一个驱动程序文件,它完成了运行此代码所需的一切。有人告诉我需要将合并排序器类泛化为使用ArrayList而不是arrays,但我不知道如何做到这一点。我想这就是我需要使用列表的地方?但不确定,任何帮助都是非常感谢的在您的逻辑中有两个主要的整体。首先,不管发生什么情况,mergesort都会返回它的输入。其次,合并后的数组永远不会被存储
private Integer[] mergesort(Integer[] array) {
if(array.length > 1) {
Integer[] left = new Integer[array.length /2];
Integer[] right = new Integer[array.length - left.length];
mergesort(left); //problem 1.5: more on this later...
mergesort(right);
merge(left, right); //problem 2: stored array is returned but not stored
}
return array; //problem 1: returns array unchanged
}
解决问题2很简单。我们只需要将输出分配给如下字段:
Integer[] result = merge(left,right);
或
使用这两种方法之一,result
或array
将不会保留在merge()
中完成的工作。您选择的策略将取决于是否要修改输入
这种关系实际上可能与直觉相反,但如果您希望您的输入保持不变,您可以使用第二行,现在问题1也解决了,因为我们已经更改了数组
。(输入保持不变,因为Java是按值传递的,这意味着array
是一个新字段,与您的输入具有相同的数组,而不是包含该数组的相同字段,因此赋值将在字段array
中放置一个单独的数组,而不触及原始数组)。不幸的是,这个解决方案给我们留下了问题1.5,因为我们没有通过调用mergesort()
来更改左
和右
,在这种情况下,我们需要像存储merge()
的结果一样进行存储
如果您想mergesort()
更改输入数组(这不是一个不合理的想法),那么我们需要创建上述单独的Integer[]结果
,并将其值复制到数组中。这也说明了问题1.5,但可能会改变方法的意图
编辑:我忽略了第三个问题。在mergesort()
中,您已经创建了left
和right
,但它们从未被填充。您应该将数组
中的值复制到左侧
或右侧
中。比如:
for(int i=0; i<left.length; i++) left[i] = array[i];
for(int i=0; i<right.length; i++) right[i] = array[left.length+i];
for(int i=0;iIs)您使用装箱的整数
类型而不是原语int
有什么原因吗?它会给您带来什么错误?确定问题所在(例如:您可以在集成之前测试private
方法,因为调用mergesort
时,left
和right
中没有任何内容),并提供输入、实际输出和预期输出。在比较中尝试使用valueOf()
,即尝试更改left[leftI]
进入left[leftI].valueOf()
是时候学习如何调试了。非常感谢您的帮助!为我提供了很多帮助。我最不愿意做的就是让ArrayList将其变为泛型。我是否必须将整个方法名从Integer[]合并排序(…)更改为每个方法名;指向完全不同的东西?是的。而不是Integer[]
您将需要使用ArrayList
。它们实现了类似的行为,但不可互换。好的,我现在正在进行这方面的工作。但当我继续更改它时,我会在合并排序方法中遇到任何数组、左右长度之类的错误。这就是我完全迷失的地方。ArrayList
需要使用自己的方法。阅读文档以了解每种方法的作用,并找出您需要的方法。如果您无法从中获得一些信息,可以尝试搜索第三方“ArrayList教程”.Java自己将其抽象为集合
和列表
,但可能也值得一看。祝您好运。@np0212,我还遗漏了一件事。如果给您带来任何问题,我深表歉意。
for(int i=0; i<left.length; i++) left[i] = array[i];
for(int i=0; i<right.length; i++) right[i] = array[left.length+i];