形成和排序一组正整数的最快策略

时间:2012-08-21 22:15:30

标签: java arrays algorithm sorting insertion-sort

在Java中,更快的是:创建,填充然后对像下面的数组进行排序

int[] a = int[1000];
for (int i = 0; i < a.length; i++) {
    // not sure about the syntax
    a[i] = Maths.rand(1, 500) // generate some random positive number less than 500
}
a.sort(); // (which algorithm is best?)

或即时插入排序

int[] a = int[1000];
for (int i = 0; i < a.length; i++) {
    // not sure about the syntax
    int v = Maths.rand(1, 500) // generate some random positive number less than 500
    int p = findPosition(a, v); // where to insert
    if (a[p] == 0) a[p] = v;
    else {
        shift a by 1 to the right
        a[p] = v;
    }
}

1 个答案:

答案 0 :(得分:9)

有很多方法可以做到这一点:

  1. 构建数组并随意排序。这可能非常慢,因为将数组元素移动到为新元素腾出空间所需的时间几乎肯定会占据排序时间。您应该期望这最好采用Ω(n 2 )时间,其中n是您要放入数组的元素数,无论使用何种算法。在运行中进行插入排序将在此处获得预期的O(n 2 )时间。

  2. 构建未排序的数组,然后对其进行排序。如果您使用良好的排序算法,例如quicksortradix sort,这可能会非常快。您应该期望这需要O(n log n)时间(对于quicksort)或O(n lg U)时间(对于基数排序),其中n是值的数量,U是最大值。

    < / LI>
  3. 将数字逐步添加到priority queue,然后从优先级队列中取出所有元素。根据您实现优先级队列的方式,这可能非常快。例如,在这里使用binary heap将导致此过程花费O(n log n)时间,并且使用van Emde Boas tree将花费O(n lg lg U)时间,其中U是最大数字你正在存储。也就是说,这里的常数因素可能会使这种方法慢于排序值。

  4. 希望这有帮助!