import java.util.List;
/**
* 快速排序
*/
public class QuickSort {
public static <T extends Comparable<? super T>> void sort(List<T> list) {
if (list == null || list.size() < 2) {
return;
}
sort(list, 0, list.size() - 1);
}
private static <T extends Comparable<? super T>> void sort(List<T> list, int start, int end) {
if (start < end) {
//将待排序数组分为两组,左边小于等于中间值,右边大于中间值
int mid = partition(list, start, end);
//左右两边递归进行以上分组操作,直至只剩一个元素
sort(list, start, mid - 1);
sort(list, mid + 1, end);
}
}
private static <T extends Comparable<? super T>> int partition(List<T> list, int start, int end) {
//假设end所在元素为中间元素,不一定就是待排序元素的中间值
T midElement = list.get(end);
//midPoint指向最后一个小于midElement的元素所在位置
int midPoint = start - 1;
for (int index = start; index < end; index++) {
T currentElement = list.get(index);
if (currentElement.compareTo(midElement) <= 0) {
//如果当前元素小于中间元素,midPoint前进一步,并交换当前元素和midPoint所在元素位置
midPoint++;
list.set(index, list.get(midPoint));
list.set(midPoint, currentElement);
}
}
//此时,midPoint指向最后一个小于等于中间元素的元素,交换(midPoint+1)和 end 所在元素后,(midPoint+1)就是中间元素位置
list.set(end, list.get((midPoint + 1)));
list.set((midPoint + 1), midElement);
//返回中间元素所在的位置
return midPoint + 1;
}
}