簡體   English   中英

對唯一的有界數組進行排序的最有效方法?

[英]Most efficient way to sort a unique, bounded array?

我認為這是重復的,但我找不到。

假設我們有一個數組,我們知道每個值都是唯一的,並且每個值都在一個范圍之間。 例如,假設我們知道數組由 0 到 100 之間的唯一值組成。示例:

[ 5, 46, 15, 83, 55, 28 ]

然后我想將此數組排序為以下內容:

[ 5, 15, 28, 46, 55, 83 ]

顯然我可以使用 Quicksort 或任何其他比較排序,但那將是O(n log n) 也存在非比較排序,例如基數排序、桶排序、計數排序等,但據我所知,這些排序都沒有保持值必須唯一的約束。

通常情況下,您允許的約束越多,您的算法就越有效。 是否有任何算法對獨特的有界 arrays 更有效? 如果不是,哪種非比較排序算法對這種類型的數據集最有效?

鑒於唯一值的約束和限制范圍,您可以聲明一個數組,其長度足以容納給定范圍內的每個唯一 integer,然后您可以執行特殊情況的桶排序,其中每個桶總是能夠包含唯一的值,最后過濾數組以刪除剩余的空槽。 與其他非比較排序算法一樣,這種方法是 O(n) 漸近時間復雜度。

 const input = [5, 46, 15, 83, 55, 28]; function sort(unsorted, lower, upper) { const sorted = Array(upper - lower); for (let i = 0; i < unsorted.length; ++i) { sorted[unsorted[i] - lower] = unsorted[i]; } return sorted.filter(() => true); } const output = sort(input, 0, 100); console.log(output);

類似的東西?

 const arr1 = [ 5, 46, 15, 83, 55, 28 ] const min = Math.min(...arr1) const res = [] for(let v of arr1) res[v-min] = v for(let i=res.length;i--;) if (res[i]===undefined) res.splice(i, 1) console.log( res )
 .as-console-wrapper { max-height: 100%;important: top; 0; }

我建議進行計數排序,但是使用一個字節數組作為通常的計數,因為計數值只會是 0 或 1,因為要排序的數組具有唯一值。 這也適用於沒有值出現超過 255 次的數組(因此每個計數仍然適合無符號字節)。

暫無
暫無

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

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