Как сеть сортировки превосходит стандартные алгоритмы сортировки?

Что касается самого быстрого типа массива int фиксированной длины 6 , я не совсем понимаю, как эта сортировочная сеть превосходит алгоритм вроде сортировки вставкой .

Сформулируйте этот вопрос, вот сравнение количества циклов ЦП, необходимых для завершения сортировки:

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}\
};\

15
задан Community 23 May 2017 в 12:25
поделиться