假设我有以下设置:
double[] vectorUsedForSorting = new double[] { 5.8,6.2,1.5,5.4 }
double[] vectorToBeSorted = new double[] {1.1,1.2,1.3,1.4}
我想根据vectorToBeSorted
的自然数字顺序对vectorUsedForSorting
进行排序。
例如,自然排序为[1.5,5.4,5.8,6.2]
,对应于索引[2,3,0,1]
,这意味着我希望排序函数的输出为[1.3,1.4,1.1,1.2]
。
如何以最绝对有效/最快的方式执行此操作?我主要关心时间复杂性,因为我将为1,000,000个长度数组做这个。
快速/有效的答案将获得巨额奖金。
答案 0 :(得分:4)
简单的解决方案:
class D implements Comparable<D> {
double key;
double value;
@Override
public int compareTo(D other) {
return Double.compare(key, other.key);
}
}
public class Test {
public static void main(String[] args) {
double[] vectorUsedForSorting = new double[] { 5.8,6.2,1.5,5.4 };
double[] vectorToBeSorted = new double[] {1.1,1.2,1.3,1.4};
D[] array = new D[vectorUsedForSorting.length];
for (int i = 0; i < array.length; i++) {
array[i] = new D();
array[i].key = vectorUsedForSorting[i];
array[i].value = vectorToBeSorted[i];
}
Arrays.sort(array);
for (int i = 0; i < array.length; i++) {
vectorToBeSorted[i] = array[i].value;
}
System.out.println(Arrays.toString(vectorToBeSorted));
}
}
这确实需要为辅助数组和对象提供一些额外的内存,但在执行时应该接近最佳状态。
答案 1 :(得分:2)
在第一个表上执行merge-sort,并在第二个表上同时执行相同的操作。复杂性nlogn保证