In riferimento a fastest sort of fixed length 6 int array, non capisco appieno come questo sorting network superi un algoritmo come insertion sort.In che modo una rete di ordinamento supera gli algoritmi di ordinamento generici?
Modulo questa domanda, ecco un confronto tra il numero di cicli di CPU adottate per completare il tipo:
Linux 32 bit, gcc 4.4.1, processore Intel Core 2 Quad Q8300, -O2
- Insertion Sort (Daniel Stutzbach): 1425
- reti di ordinamento (Daniel Stutzbach): 1080
Il codice utilizzato è il seguente:
Insertion Sort (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;
}
}
reti di ordinamento (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
}
I understan d che le reti di ordinamento sono davvero buone per l'ordinamento in parallelo, perché alcuni dei passaggi sono indipendenti dagli altri passaggi. Ma qui non stiamo usando la parallelizzazione.
Mi aspetto che sia più veloce, in quanto ha il vantaggio di conoscere in anticipo il numero esatto di elementi. Dove e perché esattamente l'ordinamento di inserimento effettua confronti non necessari?
Edit1:
Questo è l'ingresso impostare questi codici vengono confrontati:
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}\
};\
L'ordine dell'array di input è casuale? O stai usando un array discendente? –
@crypto: domanda aggiornata! – Lazer