Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Fast Merge Sort

// Copyright (c) 2003-2009, Jodd Team (jodd.org). All Rights Reserved. import java.util.Comparator; /**  * Faster merge sort. When original JDK routine runs 5s for sorting 1 million  * objects this one runs for 3.5s.  * <p>  * reference: Arrays.mergeSort (private method).  */ public class FastMergeSort {   @SuppressWarnings( { "unchecked" })   private static void mergeSort(Object src[], Object dest[], int low, int high, int off,       Comparator c) {     int length = high - low;     // use insertion sort on smallest arrays     if (length < 7) {       for (int i = low; i < high; i++) {         for (int j = i; j > low && c.compare(dest[j - 1], dest[j]) > 0; j--) {           Object temp = dest[j];           dest[j] = dest[j - 1];           dest[j - 1] = temp;         }       }       return;     }     // recursively sort halves of dest into src     int destLow = low;     int destHigh = high;     low += off;     high += off;     int mid = (low + high) >> 1;     mergeSort(dest, src, low, mid, -off, c);     mergeSort(dest, src, mid, high, -off, c);     // is list already sorted?     if (c.compare(src[mid - 1], src[mid]) <= 0) {       System.arraycopy(src, low, dest, destLow, length);       return;     }     // merge sorted halves from src into dest     for (int i = destLow, p = low, q = mid; i < destHigh; i++) {       if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0) {         dest[i] = src[p++];       } else {         dest[i] = src[q++];       }     }   }   public void sort(Object[] a, Comparator c) {     Object aux[] = a.clone();     mergeSort(aux, a, 0, a.length, 0, c);   }   public void sort(Comparable[] a) {     Object aux[] = a.clone();     mergeSort(aux, a, 0, a.length, 0, ComparableComparator.INSTANCE);   }   // ---------------------------------------------------------------- static   public static void doSort(Object[] a, Comparator c) {     Object aux[] = a.clone();     mergeSort(aux, a, 0, a.length, 0, c);   }   public static void doSort(Comparable[] a) {     Object aux[] = a.clone();     mergeSort(aux, a, 0, a.length, 0, ComparableComparator.INSTANCE);   } } // Copyright (c) 2003-2009, Jodd Team (jodd.org). All Rights Reserved. /**  * Comparator that adapts <code>Comparables</code> to the  * <code>Comparator</code> interface.  */ class ComparableComparator<T extends Comparable<T>> implements Comparator<T> {   /**    * Cached instance.    */   public static final ComparableComparator INSTANCE = new ComparableComparator();   public int compare(T o1, T o2) {     return o1.compareTo(o2);   } }