数据结构学习笔记3.1--划分

news/2025/2/26 5:15:09

划分是快速排序的根本机制,主要是把数组分为两组:小于关键字的数据项在一组,大于关键字的数据项在一组。

    /**
     * 划分数据
     * 
     * @param left 左边数据
     * @param right 右边数据
     * @param pivot 参照值
     * @return
     */
    public static int partitionIt(int left, int right, int pivot, int[] arr)
    {
        // 左边指针
        // 左边数据-1,为了后面执行++leftPrt操作时,数据能正确+1
        int leftPrt = left - 1;

        // 右边指针
        // 右边数据-1,为了后面执行--rightPrt操作时,数据能正确-1
        int rightPrt = right + 1;

        while (true)
        {
            // 左边数据比参照值的小,不做后续操作,循环
            while (leftPrt < right && arr[++leftPrt] < pivot);

            // 右边数据比参照值的大,不做后续操作,循环
            while (rightPrt > left && arr[--rightPrt] > pivot);

            if (leftPrt >= rightPrt)
            {
                break;
            }
            else
            {
                // 交左右两边的数据
                swap(leftPrt, rightPrt, arr);
            }
        }

        return leftPrt;
    }

    /**
     * 数据交换
     * 
     * @param index1 入参1
     * @param index2 入参2
     * @param arr 比较数组
     */
    public static void swap(int index1, int index2, int[] arr)
    {
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }

算法中,我们可以这样理解:leftPrt是左边指针,rightPrt是右边指针,他们在数组下方移动(可以想象成两个人面对面行走)。

当leftPrt遇到比pivot(参照值)大时,跳出循环,此时leftPrt记录的是:大于pivot的数值所在的位置,即arr[leftPrt] > pivot;

当rightPrt遇到比pivot(参照值)小时,跳出循环,此时rightPrt记录的是:小于pivot的数值所在的位置,即arr[rightPrt] < pivot;

这时,找到的arr[leftPrt] ,arr[rightPrt] 都不在正确位置上,需要交换。

 

具体示例:

    /**
     * 测试函数
     * @param args
     */
    public static void main(String[] args)
    {
        int[] arr = { 90, 100, 20, 60, 80, 110, 120, 40, 10, 30, 50, 70 };
        partitionIt(0, arr.length - 1, 55, arr);

        for (int i = 0; i < arr.length; i++)
        {
            System.out.print(arr[i] + " ");
        }
    }

代码执行过程中数组数据项:

image

可以看到leftPrt和rightPrt都在相互靠拢着移动,当leftPrt >= rightPrt时,循环结束。

划分的效率:运行时间为O(N)。

转载于:https://www.cnblogs.com/winlrou/p/3520050.html


http://www.niftyadmin.cn/n/3230031.html

相关文章

RTP协议的报文结构

RTP头格式如图structure所示&#xff1a;开始12个八进制出现在每个RTP包中&#xff0c;而CSRC标识列表仅出现在混合器插入时。各段含义如下&#xff1a; ①版本&#xff08;V&#xff09; 2位&#xff0c;标识RTP版本。 ②填充标识&#xff08;P&#xff09; 1位&#xff0c;如…

python电路仿真软件_电路仿真软件multisim

我可以给你一份希望可以帮助你安装教程1、解压下载文件夹&#xff0c;双击运行“NI_Circuit_Design_Suite_14_0.exe”应用程序&#xff0c;弹出Multisim14.0需要解压&#xff0c;直接点击确定2、选择解压的路径&#xff0c;建议默认&#xff0c;若需要更改则点击Browse更换路径…

ILMerge在MSBuild与ILMerge在批处理文件中运行

ILMerge ILMerge是一个将多个.NET程序集合并到一个程序集中的实用程序。它可以免费使用&#xff0c;并以NuGet包的形式提供。 如果您在使用它时遇到任何问题&#xff0c;请与我们联系。&#xff08;mbarnett at microsoft dot com&#xff09;。但首先尝试阅读文档。 ILMerg…

PHP错误处理及异常处理笔记

给新人总结一下PHP的错误处理。 PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则&#xff0c;以及修改错误记录的方式. 这样&#xff0c;你就可以根据自己的需要&#xff0c;来更改和加强错误输出信息以满足实际需要. 通过日志记录功能&#xff0c;你…

移动网流量用户身份识别系统的源代码_安定门车牌识别系统厂家哪家好

产品品牌北京同兴宏业建筑装饰产品型号齐全生产城市北京发货城市北京供货总量10000最小起订1产品单价1计量单位个安定门车牌识别系统厂家哪家好 北京同兴宏业建筑装饰有限公司致力于生产优质电动门&#xff0c;车库门&#xff0c;卷帘门&#xff0c;电动伸缩门&#xff0c;段滑…

移动电话的实现

BTS,BSC,HLR,VLR,AUC,EIR,MSC

关于PHP include文件时的文件查找顺序

常常被include文件的路径搞晕。 看来是要理一理的时候了。 PHP官方文档关于include搜索路径的解释是&#xff1a;先查找工作目录下相对于include_path设置所对应的路径&#xff0c;然后再搜索执行文件所在目录相对于include_path设置所对应的路径&#xff0c;如果两个总都不存在…

status_code想要得到302却得到200_王一博新歌45分钟卖200万,粉丝消费能力强,网友认为很难听...

许多网友期待的电视剧《有翡》已经定档于12月24日播出。今日王一博为该剧演唱的插曲《熹微》上线。王一博粉丝消费能力还是很强的&#xff0c;新歌《熹微》刚上线就得到8万金唱片认证。上线9分钟销售额破100万&#xff0c;并得到白金唱片认证。上线45分钟销售额破200万&#xf…