QuickSort实现更低等于

时间:2016-11-15 18:51:04

标签: algorithm quicksort

我查看了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),因为它比较了相同的数组元素,我做了一些测试,它没有等于它。假设所有实现都是相同的,它必须具有意义,但我不知道哪个有效的情况。

1 个答案:

答案 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);

}
}