/** * @author yangsq * @Date 2007-4-20 * 快速排序实践 */ public class QuickSortDemo { private final int CUTOFF = 5; /** * @author yangsq * @Date 2007-4-20 * 交换数组中的两个元素 * @param a 需要排序的数组 * @param i,j 要交换的两个元素的位置 */ private <T extends Comparable> void swap(T[] a, int i, int j) { T temp = a[i]; a[i] = a[j]; a[j] = temp; }
/** * @author yangsq * @Date 2007-4-20 * 选出中枢元 * @param a 需要排序的数组 */ private <T extends Comparable> T hingeSel(T[] a) { int left = 0; int right = a.length - 1; int mid = a.length/2; if(a[left].compareTo(a[mid]) > 0) { swap(a, left, mid); } if(a[left].compareTo(a[right]) > 0) { swap(a, left, right); } if(a[mid].compareTo(a[right]) > 0) { swap(a, mid, right); } swap(a, mid, right-1); return a[right-1]; } /** * @author yangsq * @Date 2007-4-20 * 对数组进行快速排序 * @param a 需要排序的数组 * @param left 数组的左边界 * @param right 数组的右边界 */ public <T extends Comparable> void quickSort(T[] a, int left, int right) { if(left + CUTOFF <= right) { T pivot = hingeSel(a); int i = left, j = right-1; for(;;){ while(a[i++].compareTo(pivot)<0); while(a[j--].compareTo(pivot)>0); if(i<j) { swap(a, i, j); } else break; } swap(a, i, right-1); quickSort(a, left, i-1); quickSort(a, i+1, right); } else { insertSort(a, left, right); } } /** * @author yangsq * @Date 2007-4-20 * 插入排序 * @param a 需要排序的数组 * @param left 数组的左边界 * @param right 数组的右边界 */ private <T extends Comparable> void insertSort(T[] a, int left, int right) { int j; for(int i=left+1; i<=right; i++) { T temp = a[i]; for(j=i; j>left && temp.compareTo(a[j-1])<0; j--) { a[j] = a[j-1]; } a[j] = temp; } } }
|