【发布时间】:2010-10-10 16:17:56
【问题描述】:
关于fastest sort of fixed length 6 int array,我不完全理解这个sorting network 是如何击败像insertion sort 这样的算法的。
形成这个问题,这里是完成排序所用 CPU 周期数的比较:
Linux 32 位,gcc 4.4.1,Intel Core 2 Quad Q8300,-O2
- 插入排序 (Daniel Stutzbach):1425
- 排序网络 (Daniel Stutzbach):1080
使用的代码如下:
插入排序 (Daniel Stutzbach)
static inline void sort6_insertion_sort_v2(int *d){
int i, j;
for (i = 1; i < 6; i++) {
int tmp = d[i];
for (j = i; j >= 1 && tmp < d[j-1]; j--)
d[j] = d[j-1];
d[j] = tmp;
}
}
排序网络 (Daniel Stutzbach)
static inline void sort6_sorting_network_v1(int * d){
#define SWAP(x,y) if (d[y] < d[x]) { int tmp = d[x]; d[x] = d[y]; d[y] = tmp; }
SWAP(1, 2);
SWAP(0, 2);
SWAP(0, 1);
SWAP(4, 5);
SWAP(3, 5);
SWAP(3, 4);
SWAP(0, 3);
SWAP(1, 4);
SWAP(2, 5);
SWAP(2, 4);
SWAP(1, 3);
SWAP(2, 3);
#undef SWAP
}
我知道排序网络非常适合并行排序,因为其中一些步骤独立于其他步骤。但是这里我们没有使用并行化。
我希望它更快,因为它具有预先知道元素的确切数量的优势。 插入排序究竟在哪里以及为什么会进行不必要的比较?
EDIT1:
这是与这些代码进行比较的输入集:
int d[6][6] = {\
{1, 2, 3, 4, 5, 6},\
{6, 5, 4, 3, 2, 1},\
{100, 2, 300, 4, 500, 6},\
{100, 2, 3, 4, 500, 6},\
{1, 200, 3, 4, 5, 600},\
{1, 1, 2, 1, 2, 1}\
};\
【问题讨论】:
-
这里输入数组的顺序是随机的吗?还是您使用的是降序数组?
标签: c algorithm sorting comparison sorting-network