如何有效地将一个数组排序

时间:2014-02-07 21:44:33

标签: java arrays sorting performance

假设我有以下设置:

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个长度数组做这个。

快速/有效的答案将获得巨额奖金。

2 个答案:

答案 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保证