算法之快速排序

来源:互联网 发布:java中迭代器的使用 编辑:程序博客网 时间:2024/04/28 20:55

原理

快速排序是一种常用的排序算法,比选择排序快得多。快速排序采用递归的方法,因此,基线条件为数组为空或只包含一个元素。在这种情况下,只需原样返回数组——根本就不用排序。对于长度超过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;    }}
0 0