[编辑1之后]我在SO中看到了其他答案,通过查看我的代码,我发现我坚持Java的传递值的原则。但我的数组仍然没有排序。有人可以指出我在我的代码中犯的任何错误吗?
[编辑后2]发现问题。这与数组传递无关。在我的合并方法中,它应该是if(end-start< = 0)而不是反过来!
我正在尝试实现mergesort。但是,我无法显示我的数组的值,并且不确定如何在Java中传递我的数组,以便可以修改原始数组。
如何修改当前代码以显示已排序数组的值?
我understand java passes the copy of the array's reference around,但这不意味着原始数组会被修改吗?
CODE:
我从我的main方法调用mergesort方法。
public static void main(String[] args) {
int[] qn = {10,22,33,4,5,6,1};
qn= mergesort(qn,0,qn.length-1);
for (int i=0;i<qn.length;i++){ //print to see values if sorted/not
System.out.print(qn[i]+ " ");
}
}
public static int[] mergesort(int[] arr,int start,int end){
int mid = (end+start)/2;
if (end - start<=0){
return arr;
}
else if (end-start>=1){
arr=mergesort(arr,start,mid);
arr=mergesort(arr,mid+1,end);
}
arr=merge(arr,start,end);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+ " ");
}
System.out.println();
return arr;
}
public static int[] merge(int[] arr,int start,int end){
int mid= (start+end)/2;
if(start-end<=0){
return arr;
}
int a= start; int b = mid+1;
while (a<=mid && b <=end){
if (arr[b]<arr[a]){
int tmp = arr[b++];
for(int i=++mid;i>a;i--){
arr[i]=arr[i-1];
}
arr[a++]=tmp;
}
else if (arr[b]>arr[a]){
a++;
}
else{ //arr[b]=arr[a]
if(a==mid && b == end){
break; //all between mid and end will be equal too
}
int tmp= arr[b++];
a++;
for (int i=++mid;i>a;i--){
arr[i]=arr[i-1];
}
arr[a++]=tmp;
//a++;
//b++;
}
}
return arr;
}
}
根据下面的Manu修改了我的答案。但它仍然无法正常工作。附上以下代码:
public static void mergesort(int[] arr,int start,int end){
int mid = (end+start)/2;
if (end - start<=0){
return;
}
else if (end-start>=1){
mergesort(arr,start,mid);
mergesort(arr,mid+1,end);
}
merge(arr,start,end);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+ " ");
}
System.out.println();
return;
}
public static void merge(int[] arr,int start,int end){
int mid= (start+end)/2;
if(start-end<=0){
return;
}
int a= start; int b = mid+1;
while (a<=mid && b <=end){
if (arr[b]<arr[a]){
int tmp = arr[b++];
for(int i=++mid;i>a;i--){
arr[i]=arr[i-1];
}
arr[a++]=tmp;
}
else if (arr[b]>arr[a]){
a++;
}
else{ //arr[b]=arr[a]
if(a==mid && b == end){
break; //all between mid and end will be equal too (pearl)
}
int tmp= arr[b++];
a++;
for (int i=++mid;i>a;i--){
arr[i]=arr[i-1];
}
arr[a++]=tmp;
//a++;
//b++;
}
}
return;
}
}
答案 0 :(得分:0)
你是对的,在Java中,数组的副本的副本被传递给函数。但是,两个引用都指向相同的对象(在您的情况下为数组)。这意味着如果您在merge
- 方法中更改数组的值,则mergesort
- 方法中数组的值也会更改。将您的代码改为:
public static void mergesort(int[] arr, ...
public static void merge(int[] arr, ...
然后直接致电
merge(arr, start, mid);