快速排序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. AI 线性回归

    线性回归(Linear Regression),顾名思义,输出是输入的线性函数.因为通常会附加偏置(bias)参数,所以实际是仿射函数. 参考链接: http://cs229.stanford.edu ...

  2. C# 语法四 修饰符

    1.sealed 不能派生 2.internal 仅仅在本项目中被访问 3.public 整个系统 4.private 本类访问 5.protected 本类.派生类访问 using System; ...

  3. C#以管理员用户打开某个程序

    static void Main(string[] args) { string path = @"C:\Windows\AppPatch\AppLoc.exe"; Process ...

  4. Spring 面试问题 TOP 50

    Spring 面试问题 TOP 50 Spring Framework 现在几乎已成为 Java Web 开发的标配框架.那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢? ...

  5. Luogu4547 THUWC2017 随机二分图 概率、状压DP

    传送门 考虑如果只有$0$组边要怎么做.因为$N \leq 15$,考虑状压$DP$.设$f_i$表示当前的匹配情况为$i$时的概率($i$中$2^0$到$2^{N-1}$表示左半边的匹配情况,$2^ ...

  6. POI Sax 事件驱动解析Excel2003文件

    POI事件驱动解析Excel文件 package com.boguan.bte.util.excel; import java.io.FileInputStream; import java.io.I ...

  7. python语言程序设计9

    1, 数字转换形式中有很多东西都不会,但是总不能放仍不管把? 总结点东西吧,比如 print()中增加end=""参数表示输入后不增加换行,多个print可以连续输出. 2, 我还 ...

  8. JDK8漫谈——集合更强大

    解决什么问题 集合计算不足 解决重复代码 背后思想 管道 封装 数据处理 内容说明 是什么 计算担当.集合用于数据存储,流用于数据计算,不会修改原始数据 内置循环.高级迭代器,内置循环和计算 单向.数 ...

  9. ExtJS初探:在项目中使用ExtJS

    注意:本文写作时间是 2013 年,所讲的 ExtJS 如今早已过时,请勿学习! -------------------------------- 今天ExtJS官网发布了ExtJS最新正式版4.2. ...

  10. C_数据结构_递归实现求阶乘

    # include <stdio.h> int main(void) { int val; printf("请输入一个数字:"); printf("val = ...