我想知道最快的算法是什么.我有0到3000之间的8个整数,我需要对它们进行排序.虽然只有8个整数,但这个操作将执行数百万次.
Sve*_*ach 12
这是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);
}
Run Code Online (Sandbox Code Playgroud)
我在我的机器上对插入排序进行了计时
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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于大约1000万种类别(正好是所有40320种可能的排列的250倍),排序网络花了0.39秒,而插入排序花了0.88秒.在我看来两者都足够快.(这些数字在生成排列时大约需要0.04秒.)
最快的是简单地编写大量if语句来比较它们以确定它们的确切顺序.这将消除任何排序算法的开销.
对于仅8个整数并且假设范围远大于8,插入排序可能是最好的.尝试开始,如果分析表明它不是瓶颈,那么就离开它.
(根据许多因素,快速排序变得比插入排序更好的截止点通常在5到10个项目之间).
| 归档时间: |
|
| 查看次数: |
7801 次 |
| 最近记录: |