誰かが私に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
}
上で述べたように、私はこの関数が入力配列の「コピー」を返すことを知っています(非構造化)。これをどのように変更して破壊的な関数にすることができますか。つまり、入力配列自体が変更され、コピーは作成されません。