【问题标题】:Modifying quicksort to quicksort using to use pivot 'median of three'使用枢轴“三的中位数”将快速排序修改为快速排序
【发布时间】:2014-12-23 03:18:32
【问题描述】:

我正在尝试将使用第一个元素作为枢轴的快速排序程序修改为使用三个中位数(第一个、最后一个和中间元素的中位数)作为枢轴的快速排序。然而,到目前为止,我的实现是在测试时给了我 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);
    }
}

【问题讨论】:

  • 哪一行抛出异常?
  • @Takendarkk line 36: if (array[first] > array[mid]) { ... } line 110: int median = medianOfThree(array, first, last);第 123 行:快速排序(数组,0,array.length-1);

标签: java sorting quicksort median


【解决方案1】:

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

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

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

swap(array, first, mid);

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 2018-11-14
    • 2010-09-14
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多