挖坑填数+分治法:快速排序

本文通过生动的实例详细介绍了快速排序的基本原理及其实现过程,并分析了其时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 理论基础

挖坑填数+分治法可以很形象的讲述快速排序:
假设有如下数组 array

0123456789
7265788604283734885

现在我们要对它做升序排序

第一步,取基准数
理论上数组的任一元素都可以作为基准数,这里我们选择第 0 号元素 72,base = array[left]
现在数组可以看成:

0123456789
65788604283734885

left

right

实际上0号位72仍然存在,但我们通过 base 将 0 号位的 72 存储下来的,此时 0 号位上的元素可以被覆盖,因此逻辑上我们抽象地将 0 号位看成空白,下面的论述仍然是如此

第二步:填坑
第一个坑已经出来,接下来我们就需要填这个坑:从右到左(←)找一个小于base的数

我们找到了

0123456789
65788604283734885

left

right

填进去:

0123456789
48657886042837385

left

right

接下来从左向右(→)找到比base大的数,填充进去

0123456789
48657886042837385

left

right
0123456789
48657604283738885

left

right

依次类推,一个轮回之后,就会变成如下数组

0123456789
4865742607283738885

base=72 为基准,左边的数都小于它,右边的数都大于它
接下来再对左右两边进行如此的快排,就能得到一个有序的数组

2. 代码实现


    public static void quickSort(int[] array, int left, int right){
        if(left < right) {
            int l = left, r = right;
            int base = array[l];
            while (l < r) {
                // l小于r, 并且当前元素大于base,则继续向前寻找
                while (l < r && array[r] >= base) {
                    r--;
                }

                if (l < r) {
                    array[l] = array[r];
                    l++;
                }
                
                // l小于r, 并且当前元素小于base,则继续向前寻找
                while (l < r && array[l] <= base) {
                    l++;
                }

                if (l < r) {
                    array[r] = array[l];
                    r--;
                }

            }

            array[l] = base;

            quickSort(array, left, l - 1);
            quickSort(array, r + 1, right);
        }
    }

3. 时间复杂度

最优情况: O ( l o g 2 n ) O(log_2n) O(log2n),每次都平分
最差情况: O ( n 2 ) O(n^2) O(n2),每次都取到最大或最小,也就变成了冒泡排序
平均情况: O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值