Я изучаю Java в школе прямо сейчас, и наша последняя тема - алгоритмы сортировки на Java. Тот, который я пытаюсь понять, быстро сортируется.Java Quicksort Почему/где значения меняются?
Чтобы понять, как этот алгоритм сортирует числа в массиве, я решил пройти мой шаг кода для шага в окне отладчика Eclipse.
Теперь был один шаг, который я не могу понять, даже пройдя через него, что было похоже на сотни раз.
Мой первоначальный массив [10, 5, 3, 22, 11, 2]
Когда я иду через код запускает программу путем замены 10
и 2
, затем 5
и 3
, а затем 2
и 2
. В этот момент значение для i
составляет 1
, а значение для j
- -1
.
Теперь, как я вижу, что есть три условия
while(i<=j)
Который возвращаетfalse
, потому чтоi = 1
иj = -1
if(left < j)
Который возвращаетfalse
, потому чтоleft = 0
иj = -1
if(i < right)
Который также возвращаетfalse
, потому чтоi = 1
иright = 1
Но к моему удивлению, когда программа дойдет до последней скобки перед public static void display
программа переходит обратно на линию 40 if(i < right)
но вдруг значений right
, i
, j
и pivot
были изменены с 5
, 2
, -1
, и 3
соответственно.
Я был бы очень благодарен, если бы кто-нибудь мог объяснить, почему значения меняются.
Я также добавил две фотографии, которые показывают, что я вижу на моем окне 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);
}
}
Спасибо большое!
Возможно, вы захотите иметь sneek @ [Java Implementation of Quick Sort] (http://codereview.stackexchange.com/questions/4022/java-implementation-of-quick-sort) – Abhijeet