算法之快速排序

原理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值