/**
* 快排(除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;
}