定义:它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

过程:

用自己的话: 以前大学的时候听说牛逼的程序员是能裸写快排,导致自己学习快速排序的时候带有一点点压力,也有点难以理解,不过当我看到这篇 快速排序白话文的时候,在纸上面演示了几下,便豁然开朗,coding了一下,对作者的“挖坑填数”思想更加了解深刻,判断过程如下:

以一个数组作为示例,取区间第一个数57为基准数,也就是第一张动图的基准线。
初始时,i = 0;  j = 9;   X = a[i] = 57
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=9,符合条件,将a[9]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++;  这样一个坑a[0]就被搞定了,但又形成了一个新坑a[9],这怎么办了?简单,再找数字来填a[9]这个坑。这次从i开始向后找一个大于X的数,当i=1,符合条件,将a[1]挖出再填到上一个坑中a[9]=a[1]; j--。这样就进行了一次遍历。第二次开始i = 1;   j = 8;   X=57
再重复上面的步骤,先从后向前找,再从前向后找。
....从i开始向后找,当i=5时,由于i==j退出。此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

对挖坑填数进行总结
- 1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
- 2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
- 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
- 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

代码:

    public int[] quickSort(int[] a, int l, int r) {if (l < r) {int i = l, j = r, v = a[l];//i:左边开始活动坐标,j:右边开始活动坐标,v:基数,用于对比的值,一般取第一个while (i < j) {//只要左边游标和游标不重叠的话那么就继续遍历//每一轮遍历的时候只进行一轮,把右边的一个比基数小的数移动到左边,把左边比基数大的数移动到右边while (i < j && a[j] > v) // 找出右边比左边小的坐标j--;if (i < j)a[i++] = a[j];//进行移动,左边坐标移动一个数while (i < j && a[i] < v)// 找出左边比右边大的左边i++;if (i < j)a[j--] = a[i];//进行移动,右边坐标移动一个数}a[i] = v;//当游标重叠时填入基数this.quickSort(a, l, i - 1);this.quickSort(a, i + 1, r);return a;}return a;}

算法复杂度:

一头扎进算法导论-快速排序(挖坑填数策略)相关推荐

  1. 快速排序(Quick Sort)—挖坑填数法

    前面的博文讲了冒泡排序.选择排序.插入排序,今天我们谈谈快速排序! 快速排序的基本思想是: 1.先从序列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它 ...

  2. python自动化框架2019_《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!...

    1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...

  3. 一头扎进Node系列 - 目录

    前言 本系列是属于初级教程.博主我也还只是一个node的新兵蛋子,想通过学习官网的API文档,慢慢的打好Node基础.当然后期这系列文档会慢慢完善,并且会添加一些项目实战中遇到的一些问题以及解决方案! ...

  4. 一头扎进Shiro-自定义Realm

    在一头扎进Shiro-集成Web之前的博客,我们都是用shiro.ini保存用户.角色.权限信息,本篇文章我们将这些信息保存到数据库,通过自定义Realm完成身份验证和权限验证. 去掉用户.角色.权限 ...

  5. 一头扎进Mysql视频教程 + 源码

    [@2015-4-8] 记录一下自己的脚印:看到一个一头扎进Mysql视频教程 + 源码果断下载下来,看了看比较到位, 下载地址:http://www.xiaomengku.com/topic?id= ...

  6. 一头扎进SpringBoot视频教程(附源码与文档)

    目录:/099 一头扎进SpringBoot视频教程(附源码与文档) ┣━━<一头扎进SpringBoot>第八讲.mp4 ┣━━<一头扎进SpringBoot>第八讲源码及文 ...

  7. 一头扎进Maven3 (一)

    本系列博客将学习Maven项目管理工具,使用Maven管理jar包 一头扎进Maven3 (一):Maven安装与配置 文档结构 Maven简介 Maven安装与配置 Maven Hello Worl ...

  8. 一头扎进Maven3 (二)

    本系列博客将学习Maven项目管理工具,使用Maven管理jar包 一头扎进Maven3 (二):在 Eclipse 中使用 Maven 文档结构 m2eclipse 插件安装 在 Eclipse 中 ...

  9. 一头扎进Shiro-身份认证

    在<一头扎进Shiro-HelloWorld>中介绍了将用户信息保存在Subject认证主体,用shiro.ini模拟数据库记录用户名.密码信息完成验证的过程,这篇文章我们将讲解如何通过R ...

最新文章

  1. 阿里巴巴成立首个IoT生态联盟 将打通技术标准
  2. Android socket 编程 实现消息推送(一)
  3. sql怎么修改服务器角色,sql角色服务器的设置
  4. 学习《HTML+CSS基础课程》里的权值
  5. Docker简易搭建 ElasticSearch 集群
  6. phpstudy配置oracle,phpStudy配置sql、oracle---博主摘录
  7. 原 Spring RestTemplate中几种常见的请求方式
  8. PMP_模考三 (3A通过分享)(180题附答案及解析)
  9. wpa_supplicant2.9编译过程
  10. CSS animation 属性
  11. 不存在从“——”到“——*”的适当转换函数—已解决
  12. Python 预测孩子身高
  13. 程序设计思想与方法 笔记
  14. c++运算符优先级归纳
  15. 用swoole实现简单IM聊天室demo
  16. SQL语句一二三之SQL基本语句
  17. python中除号怎么写_除号怎么写
  18. 3.5折怎么用计算机算,论几十块钱的小主机能干什么?手把手教你改造神器!(32位黑裙晖安...
  19. UVM 代码生成器 easier UVM
  20. 变焦对焦_15个安全变焦会议的提示

热门文章

  1. ASP.NET + adminLTE (一)
  2. 爆了!K哥搞定8个Offer
  3. matlab画晶体结构图,#绘图教程专栏#不会画分子晶体结构模型?看了这篇教程就会了!...
  4. 千万高考考生的期待,蚂蚁区块链如何守护?
  5. assign 和 weak
  6. 在数据库历史上最重要的人物简介
  7. Hadoop Streaming的基本原理与参数解析
  8. WOL网络唤醒在微星主板上开启 - ubuntu 20.04
  9. 【秋招纪实录】一篇特别正经的【无领导小组讨论】经验分享
  10. PowerMill 2017五轴联动编程视频教程