【发布时间】:2015-01-13 05:01:29
【问题描述】:
我正在尝试制作自己的 quickSort 方法,并将枢轴设置为列表的第一个、中间和最后一个元素之间的中值。但是,当我将一些随机数放入一个数组中,然后使用我的 quickSort 方法时,它们有时无法正确排序。我想知道我的代码中的错误是什么以及如何修复它。
public static <T extends Comparable<T>> void quickSort(T[] list) {
quickSort(list, 0, list.length-1);
}
public static <T extends Comparable<T>> void quickSort(T[] list, int first, int last) {
int pivotIndex=0;
if(last>first) {
pivotIndex=partition(list,first,last, smartPivot);
quickSort(list, first, pivotIndex-1, smartPivot);
quickSort(list,pivotIndex+1, last, smartPivot);
}
}
public static <T extends Comparable<T>> void swap(T[] list, int index, int index2) {
T temp=list[index];
list[index]=list[index2];
list[index2]=temp;
}
public static <T extends Comparable<T>> T median(T[] list, int first, int last) {
int pivotIndex=(first+last)/2;
if (list[last].compareTo(list[first])<0) {
swap(list,first,last);
}
else if(list[last].compareTo(list[pivotIndex])<0) {
swap(list,pivotIndex,last);
}
else if (list[pivotIndex].compareTo(list[first])<0) {
swap(list,first,pivotIndex);
}
swap(list,pivotIndex, last-1);
return list[last-1];
}
public static <T extends Comparable<T>> int partition(T[] list, int first, int last) {
T pivot=null;
int low=first+1;
int high=last;
pivot=median(list,first,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) {
swap(list,high,low);
}
}
while(high>first && list[high].compareTo(pivot)>=0) {
high--;
}
return first;
}
public static void main(String[] args) {
Integer[] x={34,34543,98,562,1,6456,0,9};
quickSort(x,0,x.length-1);
for(int j=0; j<x.length;j++) {
System.out.print(x[j]+" ");
}
}
【问题讨论】:
-
为什么
median将枢轴移动到列表的最后一个元素?