我查看了quickSort实施,我发现所有网站都有这个定义:
private void quickSort(int [] array, int low, int high) {
int i = low; int j = high;
int pivot = array[low+(high-low)/2];
while (i <= j) {
while (array[i] < pivot) { i++; }
while (array[j] > pivot) { j--; }
if (i <= j) {
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++; j--;
}
}
if (low < j) quickSort(array, low, j);
if (i < high) quickSort(array, i, high);
}
我想问你关于 while(i&lt; = j),为什么它只是而(i&lt; j),因为它比较了相同的数组元素,我做了一些测试,它没有等于它。假设所有实现都是相同的,它必须具有意义,但我不知道哪个有效的情况。
答案 0 :(得分:0)
我首先要指出你试图在非现有数组中切换数组元素的代码中的错误(我想只是一个错误的复制粘贴)。请参阅下面的固定代码。
要回答你的问题,代码最终会到达正确的排序数组,但当它到达i = j时,它会运行几次不必要的迭代。
即如果原始数组列表为{24,2,1,31,45}
且while(i<=j)
,则它将仅以递归方式运行quickSort 3次:
输出结果为:
[24, 2, 1, 31, 45]
[1, 2, 24, 31, 45]
[1, 2, 24, 31, 45]
与while(i<j)
一起运行时,它将以递归方式运行4次:
[24, 2, 1, 31, 45]
[1, 2, 24, 31, 45]
[1, 2, 24, 31, 45]
[1, 2, 24, 31, 45]
第三次是不必要的,它再次运行的唯一原因是因为i = j而不是将两个游标移动到下一个元素,它只是再次使用相同的低值和高值递归调用该方法。
import java.util.Arrays;
public class HisQuickSort {
private void quickSort(int [] array, int low, int high) {
int i = low; int j = high;
int pivot = array[low+(high-low)/2];
while (i <= j) {
while (array[i] < pivot) { i++; }
while (array[j] > pivot) { j--; }
if (i <= j) {
int temp = array[i];
array[i]=array[j];
array[j]=temp;
i++; j--;
}
}
if (low < j) quickSort(array, low, j);
if (i < high) quickSort(array, i, high);
System.out.println(Arrays.toString(array));
}
public static void main(String a[]){
HisQuickSort sorter = new HisQuickSort();
//int[] array2 = new int[1000];
//array2 = randomizeArray(array2);
int[] input = {24,2,1,45,31};
System.out.println(Arrays.toString(input));
sorter.quickSort(input, 0, input.length-1);
}
}