DualPivotQuickSort is used by Arrays.sort() and provides NlogN average 
performance, but does not guarantee NlogN worst case performance. It would be 
relatively easy to incorporate the basic idea of IntroSort (see 
http://en.wikipedia.org/wiki/Introsort) to provide such a guarantee. To make 
this happen, in java.util.DualPivotQuicksort, for each primitive type one  need 
only keep track of the recursion depth relative to some constant times the log 
of the size of what is being sorted. So, for int[], one does something like:



// IntroSort normally uses a DEPTH_FACTOR of 2
private static final int DEPTH_FACTOR = 4;

private static void sort(int[] a, int left, int right, boolean leftmost){
    sort(a, left, right, leftmost 0, DEPTH_FACTOR*(31-Integer. 
numberOfLeadingZeros(right-left));
}


Then, modify the existing sort to take a couple of extra parameters to keep 
track of the recursion depth and if the recursion is going too deep, do a 
heapSort to prevent potential for quadratic time performance.

private static void sort(int[] a, int left, int right, boolean leftmost, int 
depth, int maxDepth){
   if (depth > maxDepth) {
      heapSort(a, left, right);
      return;
   }
   ...
   // replace recursive calls with
   sort(a, ... , depth+1, maxDepth)
}


I'd be happy to provide a complete DualPivotQuicksort.java source file with 
this implemented if the folks in charge think this is worthwhile.

Reply via email to