Trascorro del tempo implementando un algoritmo di quicksort in C#. Dopo aver terminato, ho confrontato la velocità della mia implementazione e il metodo Array.Sort di C#.Implementazione dell'algoritmo di ordinamento sicuro più veloce
Confronto solo la velocità su array int casuali.
Ecco la mia realizzazione:
static void QuickSort(int[] data, int left, int right)
{
int i = left - 1,
j = right;
while (true)
{
int d = data[left];
do i++; while (data[i] < d);
do j--; while (data[j] > d);
if (i < j)
{
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
else
{
if (left < j) QuickSort(data, left, j);
if (++j < right) QuickSort(data, j, right);
return;
}
}
}
Performance (durante l'ordinamento un int casuale [] con la lunghezza di 100 milioni):
- il mio algoritmo: 14.21 secondi
- Net Array <int.>. Numero: 14,84 secondi
Qualcuno sa come implementare il mio a algoritmo ancora più veloce?
Oppure qualcuno può fornire un'implementazione più veloce (non è necessario essere un quicksort!) Che la mia corsa più veloce?
Nota:
- si prega di non algoritmi che usano più core/processori per migliorare perrformance
- unica sorgente C# valido codice
mi metterà alla prova le prestazioni degli algoritmi forniti all'interno di un pochi minuti se sono online.
MODIFICA:
Pensi che l'utilizzo di una rete di ordinamento ideale per le parti che contengono meno di 8 valori migliorerebbe le prestazioni?
prova a ripetere i tempi quando un array è già in ordine ... Quindi con un array che ha solo due degli articoli nell'ordine sbagliato .. –
Un guadagno di prestazioni del 4,3% - Lo stai facendo per ragioni accademiche? – flq
Ian è corretto sulla matrice già ordinata. La scelta di un elemento pivot avrà prestazioni orribili nel caso peggiore. Detto questo, accelerare Quicksort è abbastanza semplice. Selezionare un pivot migliore utilizzando qualcosa come il metodo MedianOfThree e utilizzare un algoritmo di ordinamento più appropriato per le partizioni piccole. Presumo che tu stia facendo questo per la ricerca personale perché usare il metodo di ordinamento della libreria di sistema è quasi sempre la risposta giusta. – Blastfurnace