快速排序详解及优化(java实现)

快速排序思想

快速排序是找一个标定的数据,让数组中小于这个数的,大于这个数的分为两组,这两组再分别进行标定分组,是个递归的过程。

但是,当数组近乎于有序时,快速排序退化为O(n^2)。为了防止这发生,选择的标定是随机选择的,而不是选择最左端点的值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里随机选择标定值,防止快排退化成O(n^2),把标定值移动到最前面后,暂存下来,然后右指针移动过程中比标定值小的就放在标定值处,左指针移动过程中比标定值大的放在刚刚右指针找的那个值,这样一直移动,知道L和R相遇,最后把标定值放在L处。

实现代码


private void quickSort(int[] array , int n) {

        quickSortRecursive(array , 0 , n - 1);
    }
    //快速排序递归方程,对[L , R]区间进行排序
    private void quickSortRecursive(int[] array , int L , int R) {
        if (R - L <= 100) {
            insertSortPart(array , L , R);
            return;
        }
        if (L < R) {
            int partition = partition(array , L , R);
            quickSortRecursive(array , L , partition - 1);
            quickSortRecursive(array , partition + 1 , R);
        }
    }
    //计算标定值的索引
    private int partition(int[] array , int L , int R) {
        //int partition = array[L];
        //随机生成标定值
        int partitionIndex = (int)Math.random()*(R - L + 1) + L;
        int temp = array[partitionIndex];
        array[partitionIndex] = array[L];
        array[L] = temp;
        int partition = array[L];
        while (L < R) {
            while (L < R && array[R] >= partition) R--;
            array[L] = array[R];
            while(L < R && array[L] <= partition) L++;
            array[R] = array[L];
        }
        array[L] = partition;
        return L;
    }

快排时间复杂度是O(nlogn),排序不稳定,当有大量重复的数据时,可以选择三路快速排序,小于标定值,等于标定值,大于标定值分开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值