Nella sezione di ricorsione del libro ANSI C di K & R, essi dimostrano un
version of quicksort [that] is not the fastest possible, but it's one of the simplest.
--The C Programming Language (ANSI C) - pg. 87
Nella sua interezza:
/*qsort: sort v[left]...v[right] into increasing order*/
void qsort(int v[], int left, int right){
int i, last;
/*do nothing if array has less than 2 elements*/
if(left >= right)
return;
swap(v, left, (left + right) / 2);
last = left;
/*partition*/
for(i = left + 1; i <= right; i++)
if(v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last); /*reset partition element*/
qsort(v, left, last - 1);
qsort(v, last + 1, right);
}
dove swap(v, i, j)
scambia due membri dell'array v
.
Sto cercando di capire come questo ordina la matrice. Sembra che last
sia un elemento dell'array che separa l'array in due array più piccoli e poi viene scambiato con l'elemento di delimitazione sinistro. Viene quindi confrontato con tutti gli elementi fino al limite destro, scambiando ogni elemento più piccolo con ++last
(perché?).
Infine, l'elemento della partizione viene reinserito e i due sottoarray sono ordinati separatamente.
Se comprendo correttamente la ricorsione, questo algoritmo indica che alla fine di un passaggio tutti gli elementi a sinistra di last
sono più piccoli di tutti gli elementi a destra di last
. Ho difficoltà a trovare una spiegazione perché la maggior parte degli algoritmi qsort
sono più complicati di questo.