Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mergeSort—Java中的破坏性与非破坏性_Java_Arrays_Oop_Recursion_Mergesort - Fatal编程技术网

mergeSort—Java中的破坏性与非破坏性

mergeSort—Java中的破坏性与非破坏性,java,arrays,oop,recursion,mergesort,Java,Arrays,Oop,Recursion,Mergesort,有人能给我解释一下实现mergeSort算法的非破坏性函数和破坏性实现该函数/mergeSort算法之间的区别吗 public class MergeSort{ public static int[] merge(int[] A, int[] B){ System.out.println("merge: |A|="+A.length+", |B|="+B.length); for(int i=0; i<A.length; i+=1) System.

有人能给我解释一下实现mergeSort算法的非破坏性函数和破坏性实现该函数/mergeSort算法之间的区别吗

public class MergeSort{

    public static int[] merge(int[] A, int[] B){
        System.out.println("merge: |A|="+A.length+", |B|="+B.length);
        for(int i=0; i<A.length; i+=1) System.out.print(A[i] + ",");
        System.out.println();
        for(int i=0; i<B.length; i+=1) System.out.print(B[i] + ",");
        System.out.println();

        int [] C = new int[ A.length + B.length ];
        int a = 0, b = 0;
        for( int c = 0; c < C.length; c+=1 ){
            if (a == A.length ){
                C[c] = B[b];
                b+=1;
            }else if (b == B.length ){
                C[c] = A[a];
                a+=1;
            }else{
                if (A[a] < B[b]){
                    C[c] = A[a];
                    a+=1;
                }else{
                    C[c] = B[b];
                    b+=1;
                }
            }
        }
        for(int i=0;i<C.length;i+=1) System.out.print(C[i] + ",");
        System.out.println();
        return C;
    }

    public static int[] mergeSort(int[] M){
        System.out.println("mergesort : |M|="+M.length);
        for(int i=0; i<M.length; i+=1) System.out.print(M[i] + ",");
        System.out.println();

        if (M.length ==1){
            int [] C = new int[1]; 
            C[0] = M[0];
            return C;
        }

        int[] A = new int[ M.length/2 ];
        System.arraycopy(M,0,A,0,M.length/2);
        int[] AA = mergeSort(A);
        int[] B = new int[ M.length - M.length/2 ];
        System.arraycopy(M,M.length/2,B, 0, M.length - M.length/2);
        int[] BB = mergeSort(B);

        return merge(AA,BB); 

    }// mergeSort

}
公共类合并排序{
公共静态int[]合并(int[]A,int[]B){
System.out.println(“合并:| A |=“+A.length+”,|B |=“+B.length”);

对于(int i=0;i您可以很容易地覆盖原始数组中的值,类似这样的方法可以很好地工作,假设您的mergeSort()方法执行了它应该执行的操作

public void overwritingMergeSort(int[] M) {
    int[] sorted = mergeSort(M);
    for(int i = 0; i < sorted.length; i++) {
        M[i] = sorted[i];
    }
}

int[] arr = new int[]{2,5,1,4,3};
System.out.println(Arrays.toString(arr));
overwritingMergeSort(arr);
System.out.println(Arrays.toString(arr));

最后,您可以用排序数组的内容覆盖输入数组的内容,但我怀疑这不是您想要的?您的意思是“破坏性”与“非破坏性”。
[2,5,1,4,3]
[1,2,3,4,5]