我正在尝试创建自己的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]+" ");
}
}
答案 0 :(得分:0)
partition
似乎假设median
会将数据移动到列表的前面(low=first+1
),但实际上它会将其移动到列表的不完整端。