显示数组的值

时间:2014-06-03 09:23:04

标签: java arrays mergesort

[编辑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;
}
}

1 个答案:

答案 0 :(得分:0)

你是对的,在Java中,数组的副本的副本被传递给函数。但是,两个引用都指向相同的对象(在您的情况下为数组)。这意味着如果您在merge - 方法中更改数组的值,则mergesort - 方法中数组的值也会更改。将您的代码改为:

 public static void mergesort(int[] arr, ...
 public static void merge(int[] arr, ...

然后直接致电

 merge(arr, start, mid);