В отношении самый быстрый вид массива фиксированной длины 6 int , я не до конца понимаю, как эта сеть сортировки превосходит алгоритм, такой как сортировать .
Сформируйте этот вопрос, вот сравнение количества циклов ЦП, использованных для завершения сортировки:
Linux 32 бита, gcc 4.4.1, Intel Core 2 Quad Q8300, -O2
- сортировка вставок (Даниэль Штутцбах): 1425
- Сортировка сетей (Даниэль Штутцбах): 1080
Используемый код выглядит следующим образом:
Сортировка вставок (Даниэль Штутцбах)
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;
}
}
Сортировка сетей (Даниэль Штутцбах)
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}\
};\