algorithm - 排序 10 个数字的最快方法? (数字是 32 位)

标签 algorithm sorting insertion-sort sorting-network

我正在解决一个问题,它涉及非常快速地对 10 个数字 (int32) 进行排序。我的应用程序需要尽可能快地对 10 个数字进行数百万次排序。我正在对一个包含数十亿个元素的数据集进行采样,每次我需要从中挑选 10 个数字(简化)并对它们进行排序(并从排序后的 10 个元素列表中得出结论)。

目前我正在使用 insertion sort ,但我想我可以为我的 10 个数字的特定问题实现一个非常快速的自定义排序算法,这将击败插入排序。

我该如何解决这个问题?

最佳答案

(跟进@HelloWorld 的建议,研究排序网络。)

似乎 29 比较/交换网络是执行 10 输入排序的最快方法。我在 JavaScript 中使用 Waksman 于 1969 年发现的网络作为这个示例,它应该直接转换为 C,因为它只是 if 语句、比较和交换的列表。

function sortNet10(data) {    // ten-input sorting network by Waksman, 1969
    var swap;
    if (data[0] > data[5]) { swap = data[0]; data[0] = data[5]; data[5] = swap; }
    if (data[1] > data[6]) { swap = data[1]; data[1] = data[6]; data[6] = swap; }
    if (data[2] > data[7]) { swap = data[2]; data[2] = data[7]; data[7] = swap; }
    if (data[3] > data[8]) { swap = data[3]; data[3] = data[8]; data[8] = swap; }
    if (data[4] > data[9]) { swap = data[4]; data[4] = data[9]; data[9] = swap; }
    if (data[0] > data[3]) { swap = data[0]; data[0] = data[3]; data[3] = swap; }
    if (data[5] > data[8]) { swap = data[5]; data[5] = data[8]; data[8] = swap; }
    if (data[1] > data[4]) { swap = data[1]; data[1] = data[4]; data[4] = swap; }
    if (data[6] > data[9]) { swap = data[6]; data[6] = data[9]; data[9] = swap; }
    if (data[0] > data[2]) { swap = data[0]; data[0] = data[2]; data[2] = swap; }
    if (data[3] > data[6]) { swap = data[3]; data[3] = data[6]; data[6] = swap; }
    if (data[7] > data[9]) { swap = data[7]; data[7] = data[9]; data[9] = swap; }
    if (data[0] > data[1]) { swap = data[0]; data[0] = data[1]; data[1] = swap; }
    if (data[2] > data[4]) { swap = data[2]; data[2] = data[4]; data[4] = swap; }
    if (data[5] > data[7]) { swap = data[5]; data[5] = data[7]; data[7] = swap; }
    if (data[8] > data[9]) { swap = data[8]; data[8] = data[9]; data[9] = swap; }
    if (data[1] > data[2]) { swap = data[1]; data[1] = data[2]; data[2] = swap; }
    if (data[3] > data[5]) { swap = data[3]; data[3] = data[5]; data[5] = swap; }
    if (data[4] > data[6]) { swap = data[4]; data[4] = data[6]; data[6] = swap; }
    if (data[7] > data[8]) { swap = data[7]; data[7] = data[8]; data[8] = swap; }
    if (data[1] > data[3]) { swap = data[1]; data[1] = data[3]; data[3] = swap; }
    if (data[4] > data[7]) { swap = data[4]; data[4] = data[7]; data[7] = swap; }
    if (data[2] > data[5]) { swap = data[2]; data[2] = data[5]; data[5] = swap; }
    if (data[6] > data[8]) { swap = data[6]; data[6] = data[8]; data[8] = swap; }
    if (data[2] > data[3]) { swap = data[2]; data[2] = data[3]; data[3] = swap; }
    if (data[4] > data[5]) { swap = data[4]; data[4] = data[5]; data[5] = swap; }
    if (data[6] > data[7]) { swap = data[6]; data[6] = data[7]; data[7] = swap; }
    if (data[3] > data[4]) { swap = data[3]; data[3] = data[4]; data[4] = swap; }
    if (data[5] > data[6]) { swap = data[5]; data[5] = data[6]; data[6] = swap; }
    return(data);
}
document.write(sortNet10([5,7,1,8,4,3,6,9,2,0]));

这是网络的图形表示,分为独立的阶段。

10-input sorting network (Waksman, 1969)

为了利用并行处理,可以将 5-4-3-4-4-4-3-2 分组更改为 4-4-4-4-4-4-3-2 分组。

10-input sorting network (Waksman, 1969) re-grouped

关于algorithm - 排序 10 个数字的最快方法? (数字是 32 位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172144/

相关文章:

javascript - 用点、字母、数字对对象数组进行排序。我能够按数字排序,但混合值很难。不确定是否可以做对

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

linux - 插入排序不起作用,32 位程序集

c - 我使用哪个函数从文件中读取文本?

c - 多种类型的归并排序

c# - 在排序的链表之后/之前插入 Big O 复杂性

Java anagram 查找器算法

java - 快速排序/插入排序组合比快速排序慢?

algorithm - 查找给定数组中的两个重复元素

algorithm - 解决这个序列的逻辑是什么?