【问题标题】:How to efficiently sort one array by another如何有效地对一个数组进行排序
【发布时间】:2014-02-07 21:44:33
【问题描述】:

假设我有以下设置:

double[] vectorUsedForSorting = new double[] { 5.8,6.2,1.5,5.4 }
double[] vectorToBeSorted = new double[] {1.1,1.2,1.3,1.4}

我想根据vectorUsedForSorting 的自然数字顺序对vectorToBeSorted 进行排序。

例如,自然排序是[1.5,5.4,5.8,6.2],它对应于索引[2,3,0,1],这意味着我希望排序函数的输出是[1.3,1.4,1.1,1.2]

如何以最有效/最快速的方式做到这一点?我最关心的是时间复杂度,因为我将针对 1,000,000 个长度的数组执行此操作。

快速/高效的回答将获得大笔奖金。

【问题讨论】:

  • A) 写入排序 B) 传递两个数组 C) 仅基于第一个值同时排序。
  • 你改变主意了吗? the previous question?现在你真的需要排序吗?

标签: java arrays sorting performance


【解决方案1】:

简单的解决方案:

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));

    }
}

这确实需要一些额外的内存用于辅助数组和对象,但在执行时间上应该接近最优。

【讨论】:

  • 这个算法是 O(nlogn),因为 Arrays.sort() 是 O(nlogn)。这可能是最好的。
  • 这为 100 万个数据点提供了 560 毫秒的时间。足够好。
【解决方案2】:

对第一个表执行归并排序,同时对第二个表执行相同的操作。复杂度 nlogn 保证

【讨论】:

  • 嗯我不确定,你能写一个方法吗?我会奖励奖金。
  • 是的,没关系。我会写一些东西,如果它比 Meriton 快,我会知道你的答案。干杯。
猜你喜欢
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2016-08-12
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多