QuickSort,使用Median作为Pivot。没有正确排序

时间:2014-11-16 02:33:18

标签: java quicksort median

我正在尝试创建自己的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]+" ");
      }

}

1 个答案:

答案 0 :(得分:0)

partition似乎假设median会将数据移动到列表的前面(low=first+1),但实际上它会将其移动到列表的不完整端。