我尝试将MergeSort放入代码中(见下文)。问题是:在任何情况下都没有正确排序。 55%(1000个随机数组)正确排序,其余不是。我无法弄清楚什么是错的。任何帮助/提示将不胜感激:
import java.util.Arrays;
public class MergeSort {
public static void sort(int[] a){
if (a.length > 1){
int[] left = Arrays.copyOfRange(a,0,a.length/2);
int[] right = Arrays.copyOfRange(a,a.length/2,a.length);
sort(left);
sort(right);
a = merge(left,right);
}
}
private static int[] merge (int[] a, int[] b){
int[] c = new int[a.length+b.length];
int i = 0, j=0, k=0;
while ((i < a.length) && (j <b.length)){
if (a[i] < b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
}
while (i<a.length) c[k++] = a[i++];
while (j<b.length) c[k++] = b[j++];
return c;
}
}
答案 0 :(得分:3)
据我所知,您的合并排序算法没有任何问题,但是行中存在期望问题
a = merge(left,right);
在此行之后,您希望更改先前递归调用的值,但这样做只会更改您在本地范围内引用的值。
我试图在下面的代码中演示问题:
public static void main(String[] args)
{
Integer[] arr = new Integer[1];
arr[0] = 0;
changeArray(arr);
System.out.println(arr[0]);
changeArrayCorrected(arr);
System.out.println(arr[0]);
}
public static void changeArray(Integer[] arr)
{
Integer[] anotherArray = new Integer[1];
anotherArray[0] = 1;
arr = anotherArray;
}
public static void changeArrayCorrected(Integer[] arr)
{
arr[0] = 1;
}
出于完全相同的原因,您将看到输出分别为0和1。
有关该主题的更多信息:
Are arrays passed by value or passed by reference in Java?
精确解决方案:
替换行 - &gt;
a = merge(left,right);
使用 - &gt;
System.arraycopy(merge(left,right),0, a, 0, a.length);