使用pivot'中位数为3来修改快速排序以快速排序。

时间:2014-10-27 20:20:16

标签: java sorting quicksort median

我正在尝试修改一个Quicksort程序,该程序使用第一个元素作为枢轴到一个Quicksort,它使用三个中值(first,last和middle元素的中位数)作为pivot。到目前为止,我的实现在测试时给了我ArrayIndexOutOfBoundsException(s)。 我想我在这里遗漏了一些东西,但我无法弄清楚我错在哪里。任何帮助和建议都非常感谢。

public class Sorts {

    private static void swap(int[] array, int index1, int index2) {
        // Precondition: index1 and index2 are >= 0 and < SIZE.
        //
        // Swaps the integers at locations index1 and index2 of the values array. 
        int temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }

    private static int medianOfThree(int[] array, int first, int last) {

        int mid = array[(first+last)/2];

        if (array[first] > array[mid]) {
            swap(array, first, mid);
        }

        if (array[first] > array[last]) {
            swap(array, first, last);
        }

        if (array[mid] > array[last]) {
            swap(array, mid, last);
        }
        swap(array, mid, last-1);
        return array[last-1];
    }

    private static int partition(int[] array, int first, int last, int median) {

        int pivot = array[last-1];
        int saveF = last-1;
        boolean onCorrectSide;

        first++;
        do {
            onCorrectSide = true;
            while (onCorrectSide) {           // move first toward last
                if (array[first] > pivot) {
                    onCorrectSide = false;
                }
                else {
                    first++;
                    onCorrectSide = (first <= last);
                }
            }

            onCorrectSide = (first <= last);
            while (onCorrectSide) {         // move last toward first
                if (array[last] <= pivot) {
                    onCorrectSide = false;
                }
                else {
                    last--;
                    onCorrectSide = (first <= last);
                }
            }

            if (first < last) {
                swap(array, first, last);
                first++;
                last--;
            }
        } while (first <= last);

        swap(array, saveF, last);
        return last;
    }


    private static void quickSort(int[] array, int first, int last) {

        if (first < last) {
            int pivot;

            int median = medianOfThree(array, first, last); 
            pivot = partition(array, first, last, median);

            // values[first]..values[splitPoint - 1] <= pivot
            // values[splitPoint] = pivot
            // values[splitPoint+1]..values[last] > pivot

            quickSort(array, first, pivot - 1);
            quickSort(array, pivot + 1, last);
        }
    }


    public static void quickSort(int[] array) {
        quickSort(array, 0, array.length-1);
    }
}

1 个答案:

答案 0 :(得分:2)

您没有以正确的方式使用变量:

 int mid = array[first+last/2];

给出数组中间的值,但不是数组的偏移量(索引)。 但是你在调用方法时使用mid作为索引变量:

swap(array, first, mid);