Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 形成和排序正整数数组的最快策略_Java_Arrays_Algorithm_Sorting_Insertion Sort - Fatal编程技术网

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

Java 形成和排序正整数数组的最快策略,java,arrays,algorithm,sorting,insertion-sort,Java,Arrays,Algorithm,Sorting,Insertion Sort,在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

在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
或动态插入排序

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;
    }
}
int[]a=int[1000];
for(int i=0;i
有很多方法可以做到这一点:

  • 构建数组并进行排序。这可能非常缓慢,因为移动数组元素以为新元素留出空间所需的时间几乎肯定会支配排序时间。您应该预计这最多需要Ω(n2)的时间,其中n是要放入数组的元素数,而不管使用何种算法。动态执行插入排序需要预期的O(n2)时间

  • 构建未排序的数组,然后对其排序。如果您使用一个好的排序算法,例如or,这可能会非常快。您应该认为这需要O(n logn)时间(对于快速排序)或O(n lgu)时间(对于基数排序),其中n是值的数量,U是最大值

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


  • 希望这有帮助

    为什么不做一些计时并让我们知道呢?提示:分析复杂性。你至少试过了吗?如果你正在创建一个具有特定分布的数组(比如说只有正的和小的范围),你可以使用计数、桶排序。否则,您仍然需要比较剩下的答案。谢谢您提供了这个有趣的答案。第三个选项很适合学习,但看起来可能会有开销:)只是好奇,O(n log n)中的
    log
    与O(n lg U)中的
    lg
    不同吗?@BrianJ-不,不是。大O表示法中的对数不需要指定基数,因为它们都是彼此的常数倍数。我在第二种情况下使用了lg(二进制对数),以便更清楚地说明lg是从U中的位数推导出来的,但为了清楚起见,我可能应该更一致。@templatetypedef这是真的吗?这就像说O(n^e)中的指数不需要指定一样。比起O(log2(n))算法,我更喜欢O(log10(n))算法。是吗?@MikeB在大O表示法中说对数的基不重要与说指数的基不重要或指数本身不重要是有区别的。在后两种情况下,如果绝对重要。它适用于对数的原因是,对于任何基数b和c,log_b a=log_c a/log_c b,因此所有对数都只是彼此之间的常数因子,而大O表示法忽略常数。出于这个原因,我不知道O(log_10n)或O(log_2n)算法是否会更好,原因与。。。