我一直试图将这三个中间值实现为快速排序的实现。我知道这可能不是快速排序的最佳实现,但不幸的是我被迫使用它。
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吗?有人可以解释一下我试图实施的特定三分之一中间的逻辑吗?
答案 0 :(得分:1)
通常使用示例代码中所示的Lomotu类型方案,将[low]与[middle]和[high]值进行比较并根据需要进行交换,以使中值最终在数组[low]处。如果对已排序或反向排序的数组进行排序,则可以防止出现最坏的情使用前3个值的中位数不会阻止有序或反向有序数据的最坏情况。
使用Hoare类型分区方案,可以通过将数组索引设置为数组的中间位置,然后根据需要使用[low]和/或[high]进行交换,最终得到中位数为3(低,数组[枢轴]的中间元素,高元素。