|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2005
Città: Milano
Messaggi: 1078
|
Chiarimenti sul quicksort
Ciao a tutti, vorrei dei chiarimenti sul famoso algoritmo di quicksort. Da quanto ho capito dato un array A[n] di dimensione n, scelgo uno dei valori che sarà il mio PIVOT e utilizzo 2 indici "i" e "j" e attuo dei confronti/scambi di valori fino a trovare la posizione giusta per il mio pivot chiamando il metodo partition.
Ho provato l'algoritmo sulla frase A-S-O-R-T-I-N-G-E-X-A-M-P-L-E e mentre sulle diverse lettere non ho avuto problemi, l'unica che non riesco a posizionare dall'inizio è la lettera "N" e qui mi sorge il dubbio sul fatto che non ho ben compreso l'algoritmo. Vi scrivo il mio ragionamento. Scelgo N come pivot, inzio puntando i="A" e j="E", scorro la i e trovo "S" che è maggiore di N, mi fermo, guardo j, al momento punta ad E quindi attuo lo scambio fra S ed E ottenendo: A-E-O-R-T-I-N-G-E-X-A-M-P-L-S Ora i scorre di una posizione e trova subito la O, anche j decrementa e trova la L. Le scambio e mi trovo in questa situazione A-E-L-R-T-I-N-G-E-X-A-M-P-O-S Adesso scambio R con M ottendendo A-E-L-M-T-I-N-G-E-X-A-R-P-O-S In questo caso ora i punta a "T" e j punta a "A", scambio le due lettere con il seguente risultato A-E-L-M-A-I-N-G-E-X-T-R-P-O-S. Ok, ora viene il problema, la i cerca una lettera > di "N" e la prima che trova è la "X", la j che puntava alla "T" decrementa di una posizione e si ritrova a puntare la "X" insieme il puntatore i. i,j puntano a X quindi applico lo scambio mettendo la X in posizione di N e viceversa A-E-L-M-A-I-X-G-E-N-T-R-P-O-S La "N" in quella posizione non è corretta, e soprattutto prima del pivot N c'è la X che non fa parte di quella partition. Il codice che ho tentato di utilizzare è il seguente ![]() Sapete dirmi dove sbaglio? ![]() Grazie in anticipo..
__________________
CPU: AMD Phenom II X4 965 C3 Motherboard: Asrock 980DE3/U3S3 R2.0 Ram: G-Skill F3 CL7 4GB DDR3 1333Mhz Alimentatore: Corsair VX550w Hard-Disk: Samsung SSD EVO 860 500GB - WD Caviar Black 1 TB |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2005
Città: Milano
Messaggi: 1078
|
Nessuno?
![]()
__________________
CPU: AMD Phenom II X4 965 C3 Motherboard: Asrock 980DE3/U3S3 R2.0 Ram: G-Skill F3 CL7 4GB DDR3 1333Mhz Alimentatore: Corsair VX550w Hard-Disk: Samsung SSD EVO 860 500GB - WD Caviar Black 1 TB |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Quote:
Quote:
less(v,a[--j]) il predecremento prima di effettuare il confronto fa sì che l'elemento puntato da j sia L che è > E, quindi si decrementa ancora fino ad arrivare ad A, a quel punto si ferma ed effettui lo scambio. Poi vai avanti seguendo l'algoritmo. Questo applicando l'algoritmo che hai postato, se invece vuoi scegliere tu il pivot puoi applicare lo stesso algoritmo mettendo però prima il pivot che hai scelto in fondo (nella posizione r). Come vedi il pivot in questo modo non si muove mai, solo alla fine, all'uscita del for, viene scambiato con l'elemento in posizione i che è appunto la posizione giusta del pivot. |
||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2005
Città: Milano
Messaggi: 1078
|
Azz...Grazie mille
![]() Praticamente l'algoritmo descritto dal libro fa la stessa cosa che dici tu giusto? Sceglie sempre come pivot l'elemento in posizione R, che equivale a dire, scegli un pivot e mettilo in fondo, come hai suggerito tu, o sbaglio? Comunque grazie veramente wingman87 per l'aiuto!!! ![]()
__________________
CPU: AMD Phenom II X4 965 C3 Motherboard: Asrock 980DE3/U3S3 R2.0 Ram: G-Skill F3 CL7 4GB DDR3 1333Mhz Alimentatore: Corsair VX550w Hard-Disk: Samsung SSD EVO 860 500GB - WD Caviar Black 1 TB |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Quote:
Di nulla, sono contento di essere stato d'aiuto ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:58.