快速排序Qsort是所有学习算法和数据结构最基础的一个部分,也是考试题和面试的一个小重点。

快速排序的时间复杂度为O(N*lgN),而且常数因子很小。

  对于随机数据,效率特别高;

  对于构造的恶意数据,最坏复杂度为O(N2),解决方案为采用随机化的快排。

除了时间效率上的优势,快速排序进行就地排序,即在原数组中进行元素交换,仅需要少量临时变量。这也是Qsort在空间上的优势。

注意:快速排序属于不稳定排序。

Qsort本质上是一种分治策略。每次通过数组内的元素交换,使得对于一个选定的元素X摆在合理的位置,即所有X左边的元素都不大于X,X右边的元素都不小于X。这样只需要分别对X左边和右边两个区间分别递归执行相同的过程即可完成整个序列的排序。

对于区间a[l,…,r],我们每次选定a[r]为上述的X。

然后从a[l]开始处理,直到处理到a[r-1]这个元素。处理过程中,把序列维护如下所示的情形:

如图,在逐个元素处理过程中,绿色表示不大于X的这些元素;黄色表示不小于X的这些元素;Y箭头处表示当前正在处理的元素Y;白色的部分表示还未处理的这些元素。

整个过程需要记录的一个最重要的位置是第一个黄色元素的位置,因为后续的交换都是围绕第一个黄色元素位置进行的(当然这个位置不是固定的,会随着元素的增多向后移动)。

比较Y和X,如果Y<=X,那么说明Y可以加入绿色阵营,此时只需要交换Y和第一个黄色位置的值,黄色的区域向右移动一位就可以持续保持当前的性质了;如果Y>X(等于号在哪个判断条件并不重要,为什么?),直接Y加入黄色阵营,啥也不要做,因为性质得到保持。

最后我们得到一个这样的结果,即除了最后一个a[r]没有处理。

此时我们只需要交换a[r]与第一个黄色的值,就可以了。

此时只要对左边和右边分别进行递归分治,就可以完成整个序列的排序了。

实现中还有一些细节请一定注意哦。

快速排序Qsort的更多相关文章

  1. 1004. 成绩排名 (20) (快速排序qsort函数的使用问题)

    读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...

  2. 快排 快速排序 qsort quicksort C语言

    现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. #include<stdio.h> # ...

  3. 快速排序 [Qsort]

    在做USACO1.4 等差数列的时候,我发现如果用结构体+sort就会超时,用二维数组+qsort就能AC,所以为了不忘记Quick Sort,我还是把代码贴出来以备以后要看吧. void qsort ...

  4. python 快速排序 qsort

    def qsort(arr, start, end): if start > end: return def partition(arr, start, end): pivot = arr[st ...

  5. 数据结构65:快速排序算法(QSort,快排)

    上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort). C语言中自带函数库中就有快速排序——qsort函数 ,包含在 ...

  6. 使用Erlang实现简单的排序算法:快速排序,冒泡排序,插入排序

    [排序算法] -module(sort). -compile(export_all). %%快速排序 qsort([]) -> []; qsort([Pivot|T]) -> qsort( ...

  7. 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序

    原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...

  8. Programming Erlang 学习笔记(一)

    入门 启动Shell 在cmd中输入命令”erl”,百分号(%)表示一个注释的开始,从百分号开始到这行结束的所有文本都被看做是注释. 一个完整的命令需要以一个句点和一个回车结束. 退出erlang的命 ...

  9. OpenJudge-计算点的距离并排序

    /*===================================== 距离排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出三维空间中的n个点(不超过10个),求出n个 ...

随机推荐

  1. 用statefulSet 部署持久化的OA(Tomcat)

    1.部署多个副本的OA(Tomcat)集群,其中一个Tomcat的需要加一个定时器,其他代码跟其他的Tomcat的代码一样.需要重启后也还是保持这个状态.代码如下: apiVersion: v1 ki ...

  2. Tensorflow-hub[例子解析1]

    0. 引言 Tensorflow于1.7之后推出了tensorflow hub,其是一个适合于迁移学习的部分,主要通过将tensorflow的训练好的模型进行模块划分,并可以再次加以利用.不过介于推出 ...

  3. 你想要的Python面试都在这里了【315+道题】

    写在前面 近日恰逢学生临近毕业,课程后期大家"期待+苦逼"的时刻莫过于每天早上内容回顾和面试题问答部分[临近毕业每天课前用40-60分钟对之前内容回顾.提问和补充,专挑班里不爱说话 ...

  4. ASP.NET的生命周期

    我主要参考了这些文章 ASP.NET应用程序与页面生命周期, IIS处理Asp.net请求和 Asp.net页面生命周期 asp.net页面的生命周期 页面生命周期开始 (一)页面生命周期的主要阶段包 ...

  5. java,javascript中的url编码

    真实场景 url示例如下 http://localhost:31956/Login/Auto?Token=e8a67a9f-c062-4964-b703-d79f29c8b64e&Return ...

  6. DataWorks使用小结(二)——功能面板使用指南

    一.数据开发 1.任务开发 新建表 野路子可以直接新建一个任务,粘贴DDL,手动运行任务即可完成建表 正常应当是在“数据管理”->数据表管理中建表: 支持可视化建表和DDL建表(配合之前的宏,建 ...

  7. BZOJ 4804: 欧拉心算

    数论题不多BB,直接开始推导吧: \(\sum_{i=1}^n \sum_{j=1}^n \phi(gcd(i,j))\) \(=\sum_{i=1}^n \sum_{j=1}^n \sum_{d=1 ...

  8. [Python]Python 函数调用小例子

    函数定义: In [78]: def printme(str): ....: print str ....: return ....: 调用: In [79]: printme('This is Ji ...

  9. Runaway argument错误 [Overleaf: 在线Latex] [Type 3问题后续]

    [背景与问题描述] 在Latex中,经常出现各种问题: Runaway argument? {\contentsline {subsection}{\numberline {6.3}General c ...

  10. 生产者消费者模式 php 【转】

    在工作中常常听到某某大牛之间的交谈会涉及到,xx消费者啊啥的,到底什么大牛之间讲的是什么? 这篇文章主要解决三个问题: 1.到底什么是生产者和消费者,以及它们之间的故事 2.它们之间靠什么交流 3.应 ...