Sto imparando Java a scuola in questo momento e il nostro ultimo argomento sono algoritmi di ordinamento in Java. Quello che sto cercando di capire è quicksort.Java Quicksort perché/dove cambiano i valori?
Per capire come quell'algoritmo ordina i numeri in un array ho deciso di passare attraverso il mio passo di codice per il passaggio nella finestra del debugger di Eclipse.
Ora c'era un passo che non riesco a comprendere nemmeno dopo averlo attraversato, cosa che mi è sembrato centinaia di volte.
La mia matrice iniziale è [10, 5, 3, 22, 11, 2]
Quando vado attraverso il codice del programma inizia scambiando 10
e 2
, poi 5
e 3
e poi 2
e 2
. A quel punto il valore per i
è 1
e il valore per j
è -1
.
Ora il mio modo di vedere è che ci sono tre condizioni
while(i<=j)
che restituiscefalse
, perchéi = 1
ej = -1
if(left < j)
che restituiscefalse
, perchéleft = 0
ej = -1
if(i < right)
Che anche restituiscefalse
, perchéi = 1
eright = 1
Ma con mia sorpresa quando il programma ottiene l'ultimo staffa a destra prima public static void display
il programma salta di nuovo alla riga 40 if(i < right)
ma improvvisamente i valori per right
, i
, j
e pivot
sono passati da 5
, 2
, -1
e 3
rispettivamente.
Sarei molto grato se qualcuno potrebbe spiegare perché i valori vengono modificati.
Ho anche aggiunto due foto che mostrano quello che vedo sulla mia finestra Eclipse step I don't understand
public class QSort {
public static void quickSort(int[] arr, int left, int right){
int i = left;
int j = right;
int temp;
int pivot = arr[(left+right)/2];
System.out.println("\n\nleft = " + left + "\tright = " + right);
System.out.println("Pivot is: " + pivot + "(" + (left+right)/2 + ")");
while(i <= j){
while(arr[i] < pivot){
System.out.println("i is: " + arr[i] + "(" + i + ")");
i++;
System.out.println("i is: " + arr[i] + "(" + i + ")");
}
while(arr[j] > pivot){
System.out.println("j is: "+ arr[j] + "(" + j + ")");
j--;
System.out.println("j is: "+ arr[j] + "(" + j + ")");
}
if(i <= j){
System.out.println("i is: " + arr[i] + "(" + i + ")");
System.out.println("j is: "+ arr[j] + "(" + j + ")");
System.out.println("Swapped " + arr[i] + "(" + i + ")"+ " with " + arr[j] + "(" + j + ")");
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
System.out.println("i is: (" + i + ")");
System.out.println("j is: (" + j + ")");
System.out.println("Pivot is: " + pivot + "(" + (left+right)/2 + ")");
}
}
if(left < j){
System.out.println("j is: (" + j + ")");
quickSort(arr, left, j);
}
if(i < right){
System.out.println("i is: (" + i + ")");
quickSort(arr, i, right);
}
}
public static void display(int[] arr){
if(arr.length > 0){
System.out.print(arr[0]);
}
for(int i = 1; i < arr.length; i++){
System.out.print(", " + arr[i]);
}
}
public static void main(String[] args) {
int[] data = new int[]{10,5,3,22,11,2};
System.out.println("Before: ");
display(data);
quickSort(data, 0, data.length-1);
System.out.println("\nAfter: ");
display(data);
}
}
Grazie mille!
Si potrebbe desiderare di avere uno sneek @ [Implementazione Java di Ordinamento rapido] (http://codereview.stackexchange.com/questions/4022/java-implementation-of-quick-sort) – Abhijeet