2016-01-15 66 views
0

我用Java实现快速排序算法和这里是代码:优化快速排序

public class quickSort { 
     private int array[]; 
    private int length; 

    public void sort(int[] inputArr) { 

     if (inputArr == null || inputArr.length == 0) { 
      return; 
     } 
     this.array = inputArr; 
     length = inputArr.length; 
     quickSorter(0, length - 1); 
    } 

    private void quickSorter(int lowerIndex, int higherIndex) { 

     int i = lowerIndex; 
     int j = higherIndex; 

     // calculate pivot number, I am taking pivot as middle index number 
     int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2]; 
     // Divide into two arrays 
     while (i <= j) { 

      while (array[i] < pivot) { 
       i++; 
      } 
      while (array[j] > pivot) { 
       j--; 
      } 
      if (i <= j) { 
       exchangeNumbers(i, j); 
       //move index to next position on both sides 
       i++; 
       j--; 
      } 
     } 
     // call quickSort() method recursively 
     if (lowerIndex < j) 
      quickSorter(lowerIndex, j); 
     if (i < higherIndex) 
      quickSorter(i, higherIndex); 
    } 

    private void exchangeNumbers(int i, int j) { 
     int temp = array[i]; 
     array[i] = array[j]; 
     array[j] = temp; 
    } 

} 

然后,我与(三中位数)

public class quickSort { 
     private int array[]; 
private int length; 

public void sort(int[] inputArr) { 

    if (inputArr == null || inputArr.length == 0) { 
     return; 
    } 
    this.array = inputArr; 
    length = inputArr.length; 
    quickSorter(0, length - 1); 
} 

private void quickSorter(int lowerIndex, int higherIndex) { 

    int i = lowerIndex; 
    int j = higherIndex; 
    int mid = lowerIndex+(higherIndex-lowerIndex)/2; 
    if (array[i]>array[mid]){ 
     exchangeNumbers(i, mid); 
    } 
    if (array[i]>array[j]){ 
     exchangeNumbers(i, j); 
    } 
    if (array[j]<array[mid]){ 
     exchangeNumbers(j, mid); 
    } 

    int pivot = array[mid]; 
    // Divide into two arrays 
    while (i <= j) { 

     while (array[i] < pivot) { 
      i++; 
     } 
     while (array[j] > pivot) { 
      j--; 
     } 
     if (i <= j) { 
      exchangeNumbers(i, j); 
      //move index to next position on both sides 
      i++; 
      j--; 
     } 
    } 
    // call quickSort() method recursively 
    if (lowerIndex < j) 
     quickSorter(lowerIndex, j); 
    if (i < higherIndex) 
     quickSorter(i, higherIndex); 
} 

private void exchangeNumbers(int i, int j) { 
    int temp = array[i]; 
    array[i] = array[j]; 
    array[j] = temp; 
} 
} 

和测试主要实现:

public static void main(String[] args) { 
     File number = new File ("f.txt"); 
     final int size = 10000000; 

     try{ 
      quickSortOptimize opti = new quickSortOptimize(); 
      quickSort s = new quickSort(); 
     PrintWriter printWriter = new PrintWriter(number); 
     for (int i=0;i<size;i++){ 
      printWriter.println((int)(Math.random()*100000)); 
     } 
     printWriter.close(); 
     Scanner in = new Scanner (number); 
     int [] arr1 = new int [size]; 
     for (int i=0;i<size;i++){ 
      arr1[i]=Integer.parseInt(in.nextLine()); 
     } 
     long a=System.currentTimeMillis(); 
     opti.sort(arr1); 
     long b=System.currentTimeMillis(); 
     System.out.println("Optimaized quicksort: "+(double)(b-a)/1000); 
     in.close(); 
     int [] arr2 = new int [size]; 
     Scanner in2= new Scanner(number); 
     for (int i=0;i<size;i++){ 
      arr2[i]=Integer.parseInt(in2.nextLine()); 
     } 
     long c=System.currentTimeMillis(); 
     s.sort(arr2); 
     long d=System.currentTimeMillis(); 
     System.out.println("normal Quicksort: "+(double)(d-c)/1000); 
     }catch (Exception ex){ex.printStackTrace();} 

    } 

问题是,这种优化方法应该提高5%的性能

,但实际发生的事情是,我已经做了这个测试很多次,几乎总是让上优化的一个

正常快速排序更好的结果究竟什么是错的第二个实施

+0

你会得到什么样的时间?你有没有尝试通过探查器运行它,以查找是否有任何明显的东西? – Krease

+1

你从哪里得到5%的数字?这将高度依赖于输入数据。否则,请参阅杰里科芬的答案。 –

回答

2

三者的中位数(或更多)对于随机排序的输入通常会比较慢。

中位数为3意在帮助防止非常糟糕的情况变得非常可怕。无论如何,有很多方法可以使它变得非常糟糕,但至少可以避免一些常见排序问题 - 例如,选择第一个元素,因为如果/当(大部分)输入已经排序时,枢轴可能会产生可怕的结果。