Sto facendo un esperimento per confrontare come l'ordinamento di shell di Thomas Hibbard (dimensione del gap = 2^k-1) e l'ordinamento di shell di Donald Shell (n/2^k) si eseguano sullo stesso array. Quando la dimensione dell'array è tra 10 e 1000, Hibbard sta andando meglio della shell. Ma quando la dimensione raggiunge 10000 o superiore, l'ordinamento di shell è più veloce di Hibbard.Shell vs. Confronto di complessità del tempo di Hibbard
In base alla notazione O grande, Hibbard è O (N^1.5), Shell è O (N^2), il che mi fa pensare che Hibbard dovrebbe avere maggiori miglioramenti rispetto a Shell all'aumentare delle dimensioni del set di dati. Qualcuno può dirmi perché i miei risultati potrebbero non essere come previsto?
Capisco che la notazione O è la peggiore delle ipotesi, ma sembra che le prestazioni siano meglio allineate alla notazione.
Ecco il mio codice scritto in Java: (nota: unsortedArray viene dichiarato e inizializzato in precedenza)
{
int temp;
int[] sortedArray = unsortedArray.clone();
printArray();
int k = (int)(Math.log(sortedArray.length)/Math.log(2));
int gap = (int)(Math.pow(2,k)-1);
int count = 0;
long endTime;
long startTime = System.nanoTime();
while (gap > 0)
{
for (int g = 0; g < gap; g++)
{
for (int d = g + gap; d < sortedArray.length; d = d + gap)
{
for (int i = d; i - gap >= 0; i = i - gap)
{
if (sortedArray[i - gap] <= (sortedArray[i]))
{
break;
}
count++;
temp = sortedArray[i];
sortedArray[i] = sortedArray [i-gap];
sortedArray[i-gap] = temp;
}
}
}
k = k -1;
gap = (int)(Math.pow(2,k)-1);
}
endTime = System.nanoTime();
System.out.println("The total time for hibbard sort is" + (endTime-startTime));
System.out.println("the number of swaps for hibbard sort is" + count);
}
Si prega di notare che il codice è per l'ordinamento di shell di Hibbard. –
La misurazione della complessità in termini di 'cache misses' piuttosto che 'swap' o 'confronti' potrebbe essere informativa. – Novelocrat