Questa dimostrazione è una dimostrazione per induzione ed è la seguente:
P (n) è l'affermazione che "Quicksort ordina correttamente ogni array di input di lunghezza n."
Caso di base: ogni array di input di lunghezza 1 è già ordinato (P (1) contiene)
Fase induttiva: correzione n => 2. Correzione di alcuni array di input di lunghezza n.
È necessario mostrare: se P (k) vale per tutto k <n, anche P (n) vale
Quindi disegna un array A partizionato attorno a un perno p. Quindi disegna p e chiama la parte dell'array che è <p come prima parte, e la parte che è> p è la seconda parte. La lunghezza della parte 1 = k1 e la lunghezza della parte 2 è k2. Dalla prova di correttezza della subroutine di partizione (dimostrata in precedenza), il perno p si snoda nella posizione corretta.
Per ipotesi induttiva: 1a, 2a parte vengono ordinate correttamente per chiamate ricorsive. (Uso di P (K1), P (k2))
Quindi: dopo le chiamate ricorsive, l'intero array viene ordinato correttamente.
QED
La mia confusione : ho molti problemi nel vedere esattamente come questo ne dimostri la correttezza. Quindi supponiamo che P (k) valga davvero per tutti i numeri naturali k <n.
La maggior parte delle prove di induzione che avevo visto finora va qualcosa del genere: prova il caso base e mostra che P (n) => P (n + 1). Di solito comportavano anche una sorta di manipolazione algebrica. Questa dimostrazione sembra molto diversa e non capisco come applicare il concetto di induzione ad esso. Posso in qualche modo pensare che la chiave sia la correttezza del sottoprogramma Partition. Quindi il ragionamento per la sua correttezza è il seguente: Sappiamo che ogni chiamata ricorsiva, partizionerà l'array attorno a un perno. Questo perno sarà quindi nella sua giusta posizione. Quindi ciascun subarray verrà ulteriormente suddiviso attorno a un perno e quel perno sarà quindi nella sua posizione corretta. Questo va avanti e avanti fino a quando non si ottiene un subarray di lunghezza 1, che è ordinatamente banale.
Ma poi non assumiamo che P (k) valga per tutto k <n .... stiamo effettivamente MOSTRANDO lo fa (dal momento che la subroutine Partition posizionerà sempre un elemento nella sua posizione legittima). Non stiamo assumendo che P (k) vale per tutto k