簡體   English   中英

形成和排序一組正整數的最快策略

[英]Fastest strategy to form and sort an array of positive integers

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

有很多方法可以做到這一點:

  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是您存儲的最大數字。 也就是說,這里的常數因素可能會使這種方法比僅對值進行排序更慢。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM