算法:快速排序之单边循环法(二)

news/2024/5/19 23:36:55 标签: 1024程序员节, 算法, 快速排序, java

算法快速排序的学习(二)

第二节 快速排序


文章目录


前言

算法对于一个程序员来说可以是一门必修课,基础的排序算法更是重要。在我学习期间,将自己学到的东西进行分享,希望可以帮到大家。
特别感谢《漫画算法-小灰的算法之旅》,魏梦舒著。提供的知识。


一、快速排序的实现(单边循环法)

双边循环法从数组的两边交替遍历元素,虽然更加直观,但是代码实现相对烦琐。而单边循环法则简单得多,只从数组的一边对元素进行遍历和交换。我们来看一看详细过程。

  1. 给出原始数列如下,要求对其从小到大进行排序。
    在这里插入图片描述

  2. 开始和双边循环法相似,首先选定基准元素pivot。同时,设置一个mark指针指向数列起始位置,这个mark指针代表小于基准元素的区域边界。
    在这里插入图片描述

  3. 接下来,从基准元素的下一个位置开始遍历数组。
    如果遍历到的元素大于基准元素,就继续往后遍历。
    如果遍历到的元素小于基准元素,则需要做两件事:第一,把mark指针右移1位,因为小于pivot的区域边界增大了1;第二,让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素归属于小于pivot的区域。
    首先遍历到元素7,7>4,所以继续遍历。
    在这里插入图片描述

  4. 接下来遍历到的元素是3,3<4,所以mark指针右移1位。
    在这里插入图片描述

  5. 随后,让元素3和mark指针所在位置的元素交换,因为元素3归属于小于pivot的区域。
    在这里插入图片描述

  6. 按照这个思路,继续遍历,后续步骤如图所示。
    在这里插入图片描述
    实现代码如下:

java">public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] array=new int[] {28,6,41,20,33,17,9,95,71};
        quickSort(array,0,array.length-1);
        System.out.println(Arrays.toString(array));
    }
    //递归调用快速排序算法
    public static void quickSort(int[] array, int startIndex, int endIndex) {
        if(startIndex>=endIndex) {
            return;
        }
        //基准元素的产生方法
        int pivotIndex=partition(array,startIndex,endIndex);
        quickSort(array,startIndex,pivotIndex-1);
        quickSort(array,pivotIndex+1,endIndex);
    }

    //单边循环的实现,找到基准点
    private static int partition(int[] array, int startIndex, int endIndex) {
        //基准点,当前数组的第一个元素作为基准点使用。
        int pivot=array[startIndex];
        //标记指针----->实现单边循环的关键对象,从当前数组的起点开始
        int mark=startIndex;
        //单边的具体实现
        for(int i=startIndex+1; i<=endIndex; i++) {
            //基准点大于当前i所在的元素,就要让mark标记自动加一,移动下一个位置,并将当前位置的元素与i除的元素进行交换即可。
            if(pivot>array[i]) {
                mark++;
                int temp=array[i];
                array[i]=array[mark];
                array[mark]=temp;
            }
        }
        //一次下来,将基准点与mark相互换位置
        array[startIndex]=array[mark];
        array[mark]=pivot;
        return mark;
    }

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

相关文章

功能强大的Xcode辅助工具Faux Pas:帮你找到各种隐形的bug

本文转载至 http://www.cocoachina.com/industry/20140804/9307.html Faux Pas&#xff08;Beta版下载地址&#xff09;是一个Xcode辅助工具&#xff0c;用以检查Xcode项目&#xff0c;找出常见的错误、隐藏的bug、不良实践以及可维护性问题和风格问题。目前Faux Pas刚刚发布了…

8种常见SQL错误用法

1、LIMIT 语句 分页查询是最常用的场景之一&#xff0c;但也通常也是最容易出问题的地方。比如对于下面简单的语句&#xff0c;一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引&#xff0c;性能迅速提升。 SELECT * F…

每日一题:判断一个数是否为回文数

每日一题&#xff1a;判断一个数是否为回文数 文章目录每日一题&#xff1a;判断一个数是否为回文数一、题目描述二、代码实现一、题目描述 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数…

iOS进程间通信之CFMessagePort

本文转载至 http://www.cocoachina.com/industry/20140606/8701.html iOS系统是出了名的封闭&#xff0c;每个应用的活动范围被严格地限制在各自的沙盒中。尽管如此&#xff0c;iOS还是提供了若干进程间通信机制&#xff0c;CFMessagePort就是其中之一。 “”阅读器 iOSCFMessa…

扛住100亿次请求——如何做一个“有把握”的春晚红包系统?

羊年春晚摇一摇活动已经落下帷幕&#xff0c;现在回过头来看看这一全民参与的有趣的活动背后&#xff0c;有着怎样的后台系统&#xff1f;这个系统又是如何被设计与实现出来的&#xff1f; 1. 春晚摇一摇活动形式 在了解这个系统之前&#xff0c;先看看羊年春晚有哪些活动形式…

每日一题:如何用栈实现队列

每日一题&#xff1a;如何用栈实现队列 文章目录每日一题&#xff1a;如何用栈实现队列一、解题思路二、实现代码一、解题思路 栈的特点是陷入后出&#xff0c;出入元素都在同一端。队列的特点是先入先出&#xff0c;出入元素在队头和队尾两端。我们可以使用两个栈来模拟一个队…

ios多线程和进程的区别(转载)

本文转载至 http://daimajishu.iteye.com/blog/1557076 很想写点关于多进程和多线程的东西&#xff0c;我确实很爱他们。但是每每想动手写点关于他们的东西&#xff0c;却总是求全心理作祟&#xff0c;始终动不了手。 今天终于下了决心&#xff0c;写点东西&#xff0c;以后可…

http、TCP/IP协议与socket之间的区别

本文转载至 http://www.2cto.com/net/201211/166537.htmlhttp、TCP/IP协议与socket之间的区别网络由下往上分为: www.2cto.com 物理层-- 数据链路层--网络层-- IP协议传输层-- TCP协议会话层--表示层和应用…