我想知道最快的算法是什麼。我有0到3000之間的8個整數,我需要對它們進行排序。雖然只有8個整數,但這個操作將執行數百萬次。什麼是少數整數最快的排序算法?
回答
對於只有8個整數,並且由於範圍遠大於8,插入排序可能是最好的。嘗試一開始,如果分析表明它不是瓶頸,那就離開它。 (根據許多因素,快速排序比插入排序更好的截止點通常在5到10個項目之間)。
最快的方法是簡單地編寫大量的if
語句來比較它們以確定它們的確切順序。這將消除任何排序算法的開銷。
正是我想提出的。 – 2011-01-22 21:25:36
比較排序算法的一個很好的來源是http://www.sorting-algorithms.com/。 請注意,即使是初始訂單狀態也會影響結果。但無論如何,對於8個整數,即使是普通的泡沫排序也應該完成這項工作。
最快的方法是用硬件實現的sorting network。除此之外,最快的方式只能通過測量來確定。我想嘗試
std::sort
,- 鴿籠(桶)排序與桶的再利用,
- 一堆
if
語句和 - 插入排序
的順序,因爲它是最簡單最難的命令(嘗試第一次正確插入排序......),直到找到一個可以維護的東西,一旦常數八的值變爲9。
另外,氣泡排序,選擇應該和shell排序值得注意。我從來沒有實際執行過這些,因爲他們的代表不好,但你可以嘗試。
爲正整數,最快的排序被稱爲算盤排序 - 這是爲O(n)
http://en.wikipedia.org/wiki/Abacus_sort
如果只有極少數的項目,那麼它是不可能的,你會發現任何性能差異從選擇任何特定的算法。
以下引用來自賓利等人。,工程排序功能可能是有趣的位置:
到插入排序各種改進,包括二進制搜索,循環展開,並處理N = 2作爲一個特殊的情況下,是沒有幫助的。 最簡單的代碼是最快的。
(重點煤礦。)
這表明,沒有花哨的修飾平原插入排序確實是一個很好的起點。正如彼得所指出的那樣,八個項目確實有點棘手,因爲它正好在通常標記插入排序和快速排序之間的切斷範圍內。
對於非常少量的整數,冒泡排序可以非常快。使用數值比較的泡泡排序可以用非常低的開銷寫入,對於小的n,O(n log n)和O(n^2)之間的實際速度差異被清除。
下面是一個奇偶合並排序網絡的C99實現(抱歉「錯誤」的語言):
#define CMP_SWAP(i, j) if (a[i] > a[j]) \
{ int tmp = a[i]; a[i] = a[j]; a[j] = tmp; }
void sort8_network(int *a)
{
CMP_SWAP(0, 1); CMP_SWAP(2, 3); CMP_SWAP(4, 5); CMP_SWAP(6, 7);
CMP_SWAP(0, 2); CMP_SWAP(1, 3); CMP_SWAP(4, 6); CMP_SWAP(5, 7);
CMP_SWAP(1, 2); CMP_SWAP(5, 6); CMP_SWAP(0, 4); CMP_SWAP(1, 5);
CMP_SWAP(2, 6); CMP_SWAP(3, 7); CMP_SWAP(2, 4); CMP_SWAP(3, 5);
CMP_SWAP(1, 2); CMP_SWAP(3, 4); CMP_SWAP(5, 6);
}
我計時它在我的機器上對插入排序
void sort8_insertion(int *a)
{
for (int i = 1; i < 8; i++)
{
int tmp = a[i];
int j = i;
for (; j && tmp < a[j - 1]; --j)
a[j] = a[j - 1];
a[j] = tmp;
}
}
對於大約1000萬種(正好是所有40320個可能排列的250倍),排序網絡花費了0.39秒,而插入排序花費了0.88秒。對我來說似乎足夠快。 (這些數字約爲0.04秒,用於生成置換。)
您是否已經對您的代碼進行了分析以顯示排序是瓶頸?如果它不是瓶頸,那麼加速它不會給你帶來太多的收益。排序八個短整數非常快。
一般來說,除非你是一個真正的排序專家,否則std :: sort()會比你寫的任何東西都快。
我對{0,429,857,1286,1714,2143,2571,3000}的所有排列運行了排序算法庫。
最快的分別爲:
name time stable in-place
AddressSort 0.537 No No
CenteredLinearInsertionSort 0.621 Yes No
CenteredBinaryInsertionSort 0.634 Yes No
BinaryInsertionSort 0.639 Yes Yes
...
QuickSort 0.650 No Yes
...
BubbleSort 0.802 Yes Yes
更多關於AddressSort看到http://portal.acm.org/citation.cfm?id=320834
對於整數,你可以嘗試基數排序。這是O(N)。
年以後)最多32個輸入, 請參閱Sorting network generator。 對於8路輸入,它使19個互換,像斯文Marnach的回答是:
o--^--^--------^--------------------------o
| | |
o--v--|--^--^--|--^--^--------------------o
| | | | | |
o--^--v--|--v--|--|--|--^--------^--------o
| | | | | | |
o--v-----v-----|--|--|--|--^--^--|--^--^--o
| | | | | | | | |
o--^--^--------v--|--v--|--|--|--v--|--v--o
| | | | | | |
o--v--|--^--^-----v-----|--|--|-----v-----o
| | | | | |
o--^--v--|--v-----------v--|--v-----------o
| | |
o--v-----v-----------------v--------------o
There are 19 comparators in this network,
grouped into 7 parallel operations.
[[0,1],[2,3],[4,5],[6,7]]
[[0,2],[1,3],[4,6],[5,7]]
[[1,2],[5,6],[0,4],[3,7]]
[[1,5],[2,6]]
[[1,4],[3,6]]
[[2,4],[3,5]]
[[3,4]]
- 1. 什麼是最快的快速排序 - 排序算法的排名表?
- 2. 尋找正整數的力量最快的算法是什麼?
- 3. 爲什麼快速排序被認爲是最快的排序算法?
- 4. 什麼是兩個排序列表交集的最快算法?
- 5. 排序這些n^2數字的最快方法是什麼?
- 6. 爲什麼這種排序算法只排序爲最終整數的值?
- 7. 什麼是隨機浮點數的最佳排序算法?
- 8. 什麼會是整數遵循均勻分佈排序隨機整數與假設數組的最快方法?
- 9. 執行指數運算的最快算法是什麼?
- 10. 做整數除法的最快方法是什麼?
- 11. 排序算法整數最多有n個點的整數
- 12. 什麼是計算32的冪對數的最快方法?
- 13. 什麼是快速排序的最佳輸入數組
- 14. 初始化大整數列表的最快方法是什麼?
- 15. 什麼是在Python中過濾整數表的最快方法?
- 16. 什麼是確定數組是否被排序的最快方法?
- 17. 什麼是排序依據年齡的人一個數組的最快方法?
- 18. 排序矢量的最快方法是什麼?
- 19. 什麼是查找排序範圍內元素數量的最快方法?
- 20. 這是什麼樣的排序算法?
- 21. 如何排序比快速排序更快的整數數組?
- 22. 什麼是更快的算法來重新排列給定的數組數組
- 23. 在clojure中添加兩個整數數組的最快方法是什麼?
- 24. 什麼是在python中初始化整數數組的最快方法?
- 25. 迭代時排序的最佳算法是什麼
- 26. 這種情況下最好的排序算法是什麼?
- 27. 什麼是最好的預留座位排序算法?
- 28. 什麼是測試最佳排序算法的雙向鏈表
- 29. 什麼是多線程編程的最佳排序算法?
- 30. 什麼是計算存儲數字所需位數的最快方法
這在很大程度上取決於該值是什麼,以及它們的初始訂單(並在具體實現算法,平臺的.. )。最終你需要測量和比較自己。 – 2011-01-22 21:19:44
「最快」排序有多重要。有了這麼少的數字,它就沒有什麼區別了。所以,除非速度對速度過於敏感,否則我會從最簡單的8種元素排序開始。 – 2011-01-22 22:10:53
如果該操作將被執行數百萬次,那麼可能有一件事需要並行運行多個sort-8-integer操作。 N核心可以產生N倍的加速... – 2012-06-11 02:53:49