一尘不染

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

algorithm

在Java中,更快的方法是:创建,填写然后对一个int数组进行排序,如下所示

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

阅读 241

收藏
2020-07-28

共1个答案

一尘不染

您可以通过多种方式执行此操作:

  1. 构建数组并按需排序。这可能非常慢,因为将数组元素移到为新元素腾出空间所需的时间几乎肯定会占据排序时间。您应该期望这最多花​​费Ω(n 2)时间,其中n是要放入数组中的元素数,而与使用的算法无关。在此处即时进行插入排序将花费预期的O(n 2)时间。

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

  3. 将数字递增地添加到优先级队列,然后从优先级队列中取出所有元素。根据实现优先级队列的方式,这可能会非常快。例如,在此处使用二进制堆将导致此过程花费O(n log n)时间,而使用van Emde Boas树将花费O(n lg lg U)时间,其中U是您存储的最大数字。就是说,这里的常量因素可能会使此方法比仅对值进行排序慢。

希望这可以帮助!

2020-07-28