将三权中值实现为通用快速排序

时间:2016-04-02 00:39:35

标签: java arrays sorting quicksort

我一直试图将这三个中间值实现为快速排序的实现。我知道这可能不是快速排序的最佳实现,但不幸的是我被迫使用它。

public static <E extends Comparable<E>> void quickSort(E[] list){
    quickSort(list, 0, list.length - 1);
}

private static <E extends Comparable<E>> void quickSort(E[] list, int first, int last){
    if (last > first) {
        int pivotIndex = partition(list, first, last);
        quickSort(list, first, pivotIndex - 1);
        quickSort(list, pivotIndex + 1, last);
    }
}

private static <E extends Comparable<E>> int partition(E[] list, int first, int last){
    E pivot = list[first];
    int low = first + 1;
    int high = last;

    while (high > low) {
        while (low <= high && (list[low].compareTo(pivot) <= 0)){
            low++;
        }

        while (low <= high && (list[high].compareTo(pivot) > 0)){
            high--;
        }

        if (high > low){
            E temp = list[high];
            list[high] = list[low];
            list[low] = temp;
        }
    }

    while (high > first && (list[high].compareTo(pivot) >= 0)){
        high--;
    }

    if (pivot.compareTo(list[high]) > 0){
        list[first] = list[high];
        list[high] = pivot;
        return high;
    } else{
        return first;
    }
}

我先做的是改变它以使用通用数组。现在我需要将数据透视设置为list数组中前三个值的中位数。

我理解如何获得前三个值的中位数。我不明白的是它如何影响这种快速排序实现的工作方式。

将枢轴设置为中值后,这对前后搜索有何影响?在显示的代码中,low设置为&#34; left&#34;元素递增1.在我的特定情况下,我会将枢轴值增加1吗?有人可以解释一下我试图实施的特定三分之一中间的逻辑吗?

1 个答案:

答案 0 :(得分:1)

通常使用示例代码中所示的Lomotu类型方案,将[low]与[middle]和[high]值进行比较并根据需要进行交换,以使中值最终在数组[low]处。如果对已排序或​​反向排序的数组进行排序,则可以防止出现最坏的情使用前3个值的中位数不会阻止有序或反向有序数据的最坏情况。

使用Hoare类型分区方案,可以通过将数组索引设置为数组的中间位置,然后根据需要使用[low]和/或[high]进行交换,最终得到中位数为3(低,数组[枢轴]的中间元素,高元素。