原理
快速排序是一种常用的排序算法,比选择排序快得多。快速排序采用递归的方法,因此,基线条件为数组为空或只包含一个元素。在这种情况下,只需原样返回数组——根本就不用排序。对于长度超过1的数组则要使用分而治之的思想,因此需要将数组分解,直到满足基线条件。
步骤如下:
首先,从数组中选择一个元素,这个元素被称为基准值(pivot)。
找出比基准值小的元素以及比基准值大的元素。这被称为分区(partitioning)。
对这两个子数组(小于基准值的元素和大于基准值的元素)进行快速排序。
注意:快速排序的性能高度依赖于你选择的基准值。所以快速排序的时间复杂度的区间为:最糟情况O(n2 )——最佳情况O(nlogn)
代码
public class QuickSortDemo {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(0, 2, 4, 6, 8, 1, 3, 5, 7, 9);
list.forEach(item -> {
System.out.println(item);
});
System.out.println("-----------------------------------");
List<Integer> result = quickSort(list);
result.forEach(item -> {
System.out.println(item);
});
}
public static List<Integer> quickSort(List<Integer> list) {
if (list == null || list.size() < 2) { //基线条件:为空或只包含一个元素的数组是“有序”的
return list;
}
int pivot = list.get(0); //基准值
List<Integer> less = list.stream().filter(item -> item < pivot).collect(Collectors.toList()); //由所有小于基准值的元素组成的子数组
List<Integer> greater = list.stream().filter(item -> item > pivot).collect(Collectors.toList()); //由所有大于基准值的元素组成的子数组
//合并并返回
List<Integer> result = quickSort(less);
result.add(pivot);
result.addAll(quickSort(greater));
return result;
}
}