package com.tom_roush.pdfbox.util; import java.util.Comparator; import java.util.List; /** * see http://de.wikipedia.org/wiki/Quicksort. * * @author UWe Pachler */ public class QuickSort { private QuickSort() { } private static final Comparator<? extends Comparable> objComp = new Comparator<Comparable>() { public int compare(Comparable object1, Comparable object2) { return object1.compareTo(object2); } }; /** * Sorts the given list using the given comparator. * * @param list list to be sorted * @param cmp comparator used to compare the object swithin the list */ public static <T> void sort(List<T> list, Comparator<T> cmp) { int size = list.size(); if (size < 2) { return; } quicksort(list, cmp, 0, size - 1); } /** * Sorts the given list using compareTo as comparator. * * @param list list to be sorted */ public static <T extends Comparable> void sort(List<T> list) { sort(list, (Comparator<T>) objComp); } private static <T> void quicksort(List<T> list, Comparator<T> cmp, int left, int right) { if (left < right) { int splitter = split(list, cmp, left, right); quicksort(list, cmp, left, splitter - 1); quicksort(list, cmp, splitter + 1, right); } } private static <T> void swap(List<T> list, int i, int j) { T tmp = list.get(i); list.set(i, list.get(j)); list.set(j, tmp); } private static <T> int split(List<T> list, Comparator<T> cmp, int left, int right) { int i = left; int j = right - 1; T pivot = list.get(right); do { while (cmp.compare(list.get(i), pivot) <= 0 && i < right) { ++i; } while (cmp.compare(pivot, list.get(j)) <= 0 && j > left) { --j; } if (i < j) { swap(list, i, j); } } while (i < j); if (cmp.compare(pivot, list.get(i)) < 0) { swap(list, i, right); } return i; } }