快速排序Qsort
快速排序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的更多相关文章
- 1004. 成绩排名 (20) (快速排序qsort函数的使用问题)
读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...
- 快排 快速排序 qsort quicksort C语言
现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. #include<stdio.h> # ...
- 快速排序 [Qsort]
在做USACO1.4 等差数列的时候,我发现如果用结构体+sort就会超时,用二维数组+qsort就能AC,所以为了不忘记Quick Sort,我还是把代码贴出来以备以后要看吧. void qsort ...
- python 快速排序 qsort
def qsort(arr, start, end): if start > end: return def partition(arr, start, end): pivot = arr[st ...
- 数据结构65:快速排序算法(QSort,快排)
上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort). C语言中自带函数库中就有快速排序——qsort函数 ,包含在 ...
- 使用Erlang实现简单的排序算法:快速排序,冒泡排序,插入排序
[排序算法] -module(sort). -compile(export_all). %%快速排序 qsort([]) -> []; qsort([Pivot|T]) -> qsort( ...
- 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序
原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...
- Programming Erlang 学习笔记(一)
入门 启动Shell 在cmd中输入命令”erl”,百分号(%)表示一个注释的开始,从百分号开始到这行结束的所有文本都被看做是注释. 一个完整的命令需要以一个句点和一个回车结束. 退出erlang的命 ...
- OpenJudge-计算点的距离并排序
/*===================================== 距离排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出三维空间中的n个点(不超过10个),求出n个 ...
随机推荐
- nodeJS---URL相关模块用法(url和querystring)
nodeJS---URL相关模块用法(url和querystring) 一: URL模块: URL模块用于解析和处理URL的字符串,提供了如下三个方法: 1. parse 2. format 3. r ...
- centos7搭建elasticsearch
Elasticsearch:负责日志检索和分析,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等 Logstash:对日志进行收集.过 ...
- java Scanner类的使用
参考链接:https://blog.csdn.net/android_depon/article/details/69669160 https://www.cnblogs.com/zhengc ...
- BP浅谈
之前一直对BP的理解不透彻,这可不行,这个可是超经典的广泛应用在ML中的求偏导的方法.本博来自<神经网络与机器学习>P86页. 在用到bp的地方我们都是为了使用梯度下降法,并求出他的偏导数 ...
- MongoDB的数据类型介绍
参考MongoDB官网:https://docs.mongodb.com/manual/reference/bson-types/ MongoDB文档存储是使用BSON类型,BSON(BSON sho ...
- python 取值方法:截取字符串
截取最后三位:aa=“TFR20171230001-1”cc=aa[-3]+aa[-2]+aa[-1] aa="1.36x36.8-ddr" bb=aa.split('x')[1] ...
- svg画弧
http://www.pindari.com/svg-arc.html https://jsfiddle.net/8robssa0/ http://jsbin.com/giyotacuxu/edit? ...
- HTML 图片轮播制作工具
下载地址:http://wowslider.com/download/wowslider-win-setup.zip?utm_source=free_downl_win&utm_medium= ...
- 【php增删改查实例】第二十节 - 把用户管理页面集成到main.php中
把这个代码: <a href="javascript:openTab('用户管理','user/userManage.html ','icon-roleManage')" c ...
- 关于LCA
LCA:最近公共祖先 指在有根树中,找出某两个结点u和v最近的公共祖先 如图,5,7的最近公共祖先就是3 接下来,我们来了解如何求解LCA No.1 暴力 首先想到的肯定是暴力,我们搜索,从两个节点一 ...