W tej chwili uczę się języka Java w szkole, a nasz najnowszy temat to algorytmy sortowania w języku Java. Ten, który próbuję zrozumieć, to quicksort.Java Quicksort dlaczego/gdzie zmieniają się wartości?
Aby zrozumieć, w jaki sposób algorytm sortuje liczby w tablicy, zdecydowałem się przejść przez krok mojego kodu do kroku w oknie debugera Eclipse.
Teraz był jeden krok, którego nie mogę zrozumieć, nawet po przejściu przez to, co było setkami razy.
Mój początkowy tablicy jest [10, 5, 3, 22, 11, 2]
Kiedy idę przez kod uruchamia program poprzez zamianę 10
i 2
, potem 5
i 3
a następnie 2
i 2
. W tym momencie wartość dla i
to 1
, a wartość dla j
to -1
.
Teraz tak jak ja to widzę, że istnieją trzy warunki
while(i<=j)
Które zwracafalse
, ponieważi = 1
ij = -1
if(left < j)
Które zwracafalse
, ponieważleft = 0
ij = -1
if(i < right)
Który również zwracafalse
, ponieważi = 1
iright = 1
Ale ku mojemu zaskoczeniu, gdy program dojdzie do ostatniego wspornika tuż przed public static void display
program przeskakuje z powrotem do linii 40 if(i < right)
ale nagle wartości right
, i
, j
i pivot
zmieniły się odpowiednio z na 5
, 2
, -1
i 3
.
Byłbym bardzo wdzięczny, gdyby ktoś mógł wyjaśnić, dlaczego wartości się zmieniają.
Dodałem również dwa zdjęcia, które pokazują, co widzę na moim oknem 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);
}
}
Dzięki wielkie!
Możesz chcieć mieć sneek @ [Implementacja szybkiego sortowania Java] (http://codereview.stackexchange.com/questions/4022/java-implementation-of-quick-sort) – Abhijeet