/** * 快排(除null) * * @param array * @param <C> */public static <C extends Comparable> void sort(C[] array) {    if (null == array) {        return;    }    sort(array, 0, array.length - 1);}/** * 快排 * * @param array * @param start * @param end * @param <C> */private static <C extends Comparable> void sort(C[] array, int start, int end) {    if (end - start < 1) {        return;    }    select(array, start, end);    C split = array[start];    int i = start;    int j = end;    while (i < j) {        // 找到比split小的数        while (i < j && bigger(array[j], split)) {            j--;        }        if (i < j) {            array[i++] = array[j];        }        // 找到比split大的数        while (i < j && smaller(array[i], split)) {            i++;        }        if (i < j) {            array[j--] = array[i];        }    }    array[i] = split;    // 排序左边    sort(array, start, i - 1);    // 排序右边    sort(array, i + 1, end);}/** * 选择策略 * * @param array * @param start * @param end * @param <C> */private static <C extends Comparable> void select(C[] array, int start, int end) {    int mid = start + (end - start) / 2;    if (smaller(array[start], array[mid])) {        swap(array, start, mid);    } else if (smaller(array[start], array[end])) {        swap(array, start, end);    }}/** * 交换值 * * @param array * @param a * @param b * @param <C> */private static <C extends Comparable> void swap(C[] array, int a, int b) {    C t = array[a];    array[a] = array[b];    array[b] = t;}@SuppressWarnings("unchecked")public static <C extends Comparable> boolean bigger(C a, C b) {    return a.compareTo(b) > 0;}@SuppressWarnings("unchecked")public static <C extends Comparable> boolean smaller(C a, C b) {    return a.compareTo(b) < 0;}
收藏 打印