什么是针对大量(数万)由9个正双精度值组成的组进行单独排序的最快算法?因此,它必须快速地对可能重复的双精度值进行少量排序,多次执行。
这些值在[0..1]区间内。我不关心空间复杂度或稳定性,只关心速度。
什么是针对大量(数万)由9个正双精度值组成的组进行单独排序的最快算法?因此,它必须快速地对可能重复的双精度值进行少量排序,多次执行。
这些值在[0..1]区间内。我不关心空间复杂度或稳定性,只关心速度。
将每个组单独排序,使用归并排序可能是最容易实现且效果良好的。
使用排序网络可能是最快的解决方案: http://en.wikipedia.org/wiki/Sorting_network
看起来你想要一种最节约循环的方式来排序9个值。由于值的数量有限,我会(如Kathy建议的)首先对前4个元素和后5个元素进行展开插入排序。然后将这两个组合并。
这是一个展开的4个元素插入排序:
if (u[1] < u[0]) swap(u[0], u[1]);
if (u[2] < u[0]) swap(u[0], u[2]);
if (u[3] < u[0]) swap(u[0], u[3]);
if (u[2] < u[1]) swap(u[1], u[2]);
if (u[3] < u[1]) swap(u[1], u[3]);
if (u[3] < u[2]) swap(u[2], u[3]);
u
中,第二组5个元素在v
中。结果在r
中。i = j = k = 0;
while(i < 4 && j < 5){
if (u[i] < v[j]) r[k++] = u[i++];
else if (v[j] < u[i]) r[k++] = v[j++];
else {
r[k++] = u[i++];
r[k++] = v[j++];
}
}
while (i < 4) r[k++] = u[i++];
while (j < 5) r[k++] = v[j++];
这是一个好问题,因为它涉及“对9个元素的数组进行排序的最快方法”,而大多数排序方法之间的比较和分析都涉及大的N。我假设“组”已经明确定义,并且在这里没有实际作用。
您可能需要对一些候选者进行基准测试,因为许多因素(本地性)在这里发挥作用。
无论如何,将其并行化听起来像个好主意。如果您使用.NET4,则使用Parallel.For()
。
我认为你需要尝试一些例子来看哪种方法最好,因为你有一个不寻常的条件集。我猜最好的方法之一是:
考虑到双精度数字相对较长,我怀疑使用基数排序效果不会更好,但请随意添加。
值得一提的是,Java在对双精度数进行排序时,直到要排序的项目数量降至7以下才使用插入排序。第三个选项模仿了这个解决方案。
此外,你的整体问题是令人尴尬的并行,因此在可能的情况下要利用并行性。该问题看起来太小,不适合分布式解决方案(网络传输所花费的时间比节省的时间还多),但如果正确设置,你的问题可以非常有效地利用多个核心。