【问题标题】:QuickSort, Using Median as Pivot. Not Sorting Correctly快速排序,使用中值作为枢轴。没有正确排序
【发布时间】: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 将枢轴移动到列表的最后一个元素?

标签: java quicksort median


【解决方案1】:

partition 似乎假定 median 会将枢轴移动到列表的前面 (low=first+1),但实际上它会将其移动到列表的末尾。

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 2010-09-14
    • 2018-11-14
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多