我已经实现了合并排序以与我的分配算法一起使用。它可以工作,但是对于大量的测试用例,返回结果需要很长时间,而且不应该。我已经清除了我的主要方法,并且我确信合并排序是问题所在。有人能解释一下我做了什么让它如此低效吗?
public static double[] merge(double[] arrayA, double[] arrayB){
double[] arrayC = new double[0];
while((arrayA.length != 0) && (arrayB.length != 0)){
if(arrayA[0]>arrayB[0]){
arrayC = Array.arrAdd(arrayC, arrayB[0]);
arrayB = Array.arrRem(arrayB);
}else{
arrayC = Array.arrAdd(arrayC, arrayA[0]);
arrayA = Array.arrRem(arrayA);
}
}
while(arrayA.length != 0){
arrayC = Array.arrAdd(arrayC, arrayA[0]);
arrayA = Array.arrRem(arrayA);
}
while(arrayB.length != 0){
arrayC = Array.arrAdd(arrayC, arrayB[0]);
arrayB = Array.arrRem(arrayB);
}
return arrayC;
}
public static double[] mergeSort(double[] arrayA){
if(arrayA.length == 1){
return arrayA;
}
int a;
int b;
if(arrayA.length % 2 != 0){
a = (arrayA.length+1)/2;
b = (arrayA.length-1)/2;
}else{
a = (arrayA.length)/2;
b = (arrayA.length)/2;
}
double[] array1 = new double[a];
double[] array2 = new double[b];
for(int i=0; i<array1.length; i++){
array1[i] = arrayA[0];
arrayA = Array.arrRem(arrayA);
}
for(int i=0; i<array2.length; i++){
array2[i] = arrayA[0];
arrayA = Array.arrRem(arrayA);
}
array1 = mergeSort(array1);
array2 = mergeSort(array2);
return merge(array1, array2);
}
我还包括我的“arrAdd”和“arrRem”方法,它们用于在数组末尾添加一个元素并从索引 0 中删除一个元素。
public static double[] arrAdd(double[] arrayA, double value){
double[] arrayB = new double[arrayA.length+1];
System.arraycopy(arrayA, 0, arrayB, 0, arrayA.length);
arrayB[arrayA.length] = value;
return arrayB;
}
public static double[] arrRem(double[] arrayA){
double[] arrayB = new double[arrayA.length-1];
System.arraycopy(arrayA, 1, arrayB, 0, arrayA.length - 1);
return arrayB;
}