我用Java编写的合并排序程序不工作?
我试图创建我的简单合并排序程序,该程序完全是用Java编写的,试图进行排序。请告诉我,这里怎么了 mergeSort.java:我用Java编写的合并排序程序不工作?,java,data-structures,mergesort,Java,Data Structures,Mergesort,我试图创建我的简单合并排序程序,该程序完全是用Java编写的,试图进行排序。请告诉我,这里怎么了 mergeSort.java: import java.util.Arrays; public class MyProgram { public static void main(String[] args){ int[] list = {2, 5, 6, 7, 52, 64, 22, 10, 11, 14, 17, 18, 19}; System.ou
import java.util.Arrays;
public class MyProgram {
public static void main(String[] args){
int[] list = {2, 5, 6, 7, 52, 64, 22, 10, 11, 14, 17, 18, 19};
System.out.println("\t**BEFORE MERGE SORT**");
System.out.println(Arrays.toString(list));
mergeSort(list);
System.out.println("\t**AFTER MERGE SORT**");
System.out.println(Arrays.toString(list));
}
private static void mergeSort(int[] array){
if(array.length > 1){
int[] left = leftList(array);
int[] right = rightList(array);
mergeSort(left);
mergeSort(right);
//Merging the sorted half into equal parts.
merge(array, left, right);
}
}
private static int[] leftList(int[] array){
int size = array.length/2;
int left[] = new int[size];
for(int i=0; i<size; i++){
left[i] = array[i];
}
return left;
}
private static int[] rightList(int[] array){
int size1 = array.length/2;
int size2 = array.length - size1;
int right[] = new int[size2];
for(int i=0; i<size2; i++){
right[i] = array[i+size1];
}
return right;
}
private static void merge(int[] result, int[] left, int[] right){
int i1 = 0;
int i2 = 0;
for(int i=0; i<result.length; i++){
if(i2>=right.length || (i1 < left.length && left[i1] <= right[i2])){
result[i1] = left[i1];
i1++;
}
else{
result[i2] = left[i2];
i2++;
}
}
}
}
我们将不胜感激尝试合并时,您没有足够的索引检查。在进行比较时,需要确保右索引和左索引都在数组的适当范围内(小于数组的大小)。如果其中一个索引不在合适的范围内,那么我们就知道该数组已经完成,我们不必再进行任何比较,因为我们只需将另一个数组中的剩余数字相加。试着这样做:
private static void merge(int[] result, int[] left, int[] right){
int i1 = 0; //left index
int i2 = 0; //right index
for (int i=0; i<result.length; i++){
if (i1<left.length && i2<right.length){ //We have something in both lists
if (left[i1]<=right[i2]){ //Add from left
result[i] = left[i1];
i1++;
}else{ //Add from right
result[i] = right[i2];
i2++;
}
}
//If we get to here we know one list is empty
//We need to figure out which one is empty
else if (i1<left.length){//Right is empty
result[i] = left[i1]; //Add from left
i1++;
}else{ //Left is empty
result[i] = right[i2]; //Add from right
i2++;
}
}
}
私有静态无效合并(int[]结果,int[]左,int[]右){
int i1=0;//左索引
int i2=0;//右索引
对于(int i=0;i在merge
方法的末尾:
result[i2] = left[i2];
您正在索引i2
处访问数组left
,但该索引用于访问数组right
。将其替换为result[i2]=right[i2];
如果使用清晰的变量名,您自己就会看到这个错误
但是-您的mergesort仍然不起作用,但至少解决了ArrayIndexOutOfBoundsException
,-)哪一行是第63行?我同意变量名称。即使按字面上的意思将它们命名为rightIndex和leftIndex,代码的可读性也会大大提高。
result[i2] = left[i2];