快速排序

Partition 过程:将要排序的数据分成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。快速排序整个排序过程可以递归进行,以此达到整个数据变成有序序列。

注:408原题中说,对所有尚未确定最终位置的所有元素进⾏⼀遍处理称为“⼀趟”排序,因此⼀次“划分”≠⼀趟排序。因此,⼀次 Partition 可以确定⼀个元素的最终位置,⽽⼀趟排序也许可以确定多个元素的最终位置。

需要注意的是,严蔚敏和殷人昆给出了两种不同的快排方法。虽然两种方法均正确,但排序中间步骤得到的序列不同,导致做题时对答案产生疑惑。本文对这两种快排算法进行总结与对比。

严蔚敏《数据结构》P274

排序过程举例:

以上述第一趟为例,快排的过程展示如下。先圈出最左边的 49,把最左边位置空出来,然后让指针从最右边的 49 开始往左走。

代码

// 一趟快排
int Partition(SqList &L, int low, int high) {pivotkey = L[low];          //用字表的第一个记录记录枢轴的位置while (low < high) {while (low < high && L[high] > pivotkey) --high;    //将比枢轴记录小的记录移到低端L[low] = L[high];while (low < high && L[low] < pivotkey) ++low;L[high] = L[low];       //将比枢轴记录大的记录移到高端}L[low] = pivotkey;          //枢轴记录到位return low;                 //返回枢轴位置
}// 快速排序算法
void Qsort(Sqlist &L, int low, int high) {if (low < high) {                           //长度大于1pivotloc = Partition(L, low, high);     //将L一分为2QSort(L, low, pivotloc - 1);            //对低子表递归排序,pivotloc是枢轴位置Qsort(L, pivotloc + 1, high);           //对高子表递归排序}
}

殷人昆《数据结构》P406

排序过程举例:

代码

#include <iostream>#define LEN 9
using namespace std;void Print(int A[]) {for (int i = 0; i < LEN; i++) {cout << A[i] << " ";}cout << endl;
}void Swap(int &a, int &b) {int tmp = a;a = b;b = tmp;
}int Partition(int A[], int low, int high) {int pivotpos = low;int pivot = A[low];for (int i = low + 1; i < high + 1; ++i) {if (A[i] < pivot) {pivotpos++;if (pivotpos != i) {Swap(A[pivotpos], A[i]);}}}A[low] = A[pivotpos];A[pivotpos] = pivot;Print(A);return pivotpos;
}void QuickSort(int A[], const int left, const int right) {if (left < right) {int privotpos = Partition(A, left, right);QuickSort(A, left, privotpos - 1);QuickSort(A, privotpos + 1, right);}
}int main() {int A[] = {12, 2, 16, 30, 28, 10, 20, 6, 18}; //0~10QuickSort(A, 0, LEN - 1);return 0;
}

测试用例

示例 1

初始序列:

20, 4, 34, 5, 16, 33, 18, 29, 2, 40, 7

每一次调用 Partition 的结果:

7 4 5 16 18 2 20 29 33 40 34
2 4 5 7 18 16 20 29 33 40 34
2 4 5 7 18 16 20 29 33 40 34
2 4 5 7 18 16 20 29 33 40 34
2 4 5 7 16 18 20 29 33 40 34
2 4 5 7 16 18 20 29 33 40 34
2 4 5 7 16 18 20 29 33 40 34
2 4 5 7 16 18 20 29 33 34 40

示例 2

初始序列:

12, 2, 16, 30, 28, 10, 20, 6, 18

每一次调用 Partition 的结果:

6 2 10 12 28 16 20 30 18
2 6 10 12 28 16 20 30 18
2 6 10 12 18 16 20 28 30
2 6 10 12 16 18 20 28 30

数据结构:严蔚敏、殷人昆快速排序规则不同的疑问相关推荐

  1. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...

    导语 内容提要 殷人昆编著的<数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)>是清华大学出版社出版的<数据结构(C语言版)>(第2版)的配套教材,对" ...

  2. 殷人昆 数据结构(用面向对象方法与C++语言描述)(第二版)实现汇总(持续更新)

    殷人昆 数据结构(用面向对象方法与C++语言描述)(第二版)实现汇总 殷人昆 数据结构(用面向对象方法与C++语言描述)(第二版)实现汇总 第二章 线性表 第二章 线性表 约瑟夫问题(线性表实现)约瑟 ...

  3. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  4. 数据结构 严蔚敏 第二章 线性表

    数据结构 严蔚敏 第二章 线性表 线性表:由n个(n>=0)数据特征相同的元素构成的有限序列. 线性表的类型定义表示和实现 顺序表 存储单元地址连续 随机存取 若每个元素占用 m 个存储单元,以 ...

  5. 【计算机】数据结构-严蔚敏/清华大学P3

    [计算机]数据结构-严蔚敏/清华大学P1 第二章    线  性表 线性结构 是 一个数据元素的有序(次序)集 线性结构的基本特征: 1.  集合中必存在唯一的一个"第一元素": ...

  6. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  7. 数据结构----严蔚敏

    最近一直想找一本纯数据结构的书来学习,找来找去都没有找到一本合适的书籍,相比之下国内的书籍之中,严蔚敏和吴伟民的还算是经典版了,很多国内其他数据结构教材都参考这本书的.但缺点是很多都是伪代码,对编程初 ...

  8. 数据结构严蔚敏清华大学pdf_2019年清华大学自动化系控制工程专业大数据方向考研经验分享...

    基本情况(以下内容仅代表个人观点) 我目前就读于西南某双非石油工程专业,2019考研报考清华大学自动化系大数据工程专业,一志愿复试被刷,侥幸调剂录取至微电子系.初试总分346分(政治-63 + 英语一 ...

  9. 殷人昆《数据结构与算法解析》目录(持续更新)

    绝对不删,纯属代码搬运.两年内,看能更新多少... 第一章 数据结构绪论 前六个跳过了,属于两个数比较大小难度题目.以后约定俗成,用c解决.c++慎用.确保它的基础性和实用性. 1-7 枚举数字排序问 ...

最新文章

  1. Android入门:DDMS视图
  2. 听说你想去大厂看妹子,带你看看美团后端开发实习岗详细面经
  3. 怎么样在线创建索引或者重构索引
  4. 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
  5. 【转】ABP源码分析十五:ABP中的实用扩展方法
  6. 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)
  7. boot lib分离 spring_spring boot + gradle打包bootJar分离lib
  8. 各个OS关于查看磁盘和wwn号的方法
  9. 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常(转)...
  10. 0.3:Before We Start
  11. 在centos上安装html,Centos-7安装pdf2htmlEX
  12. robot framework-ride导入Selenium2Library报错,已解决
  13. kali linux 源码免杀,shellcode超级免杀
  14. Abnova循环肿瘤DNA丨全血分离,基因组DNA萃取分析
  15. c++实现经典游戏——贪吃蛇
  16. vmware workstation虚拟机安装Debian系统教程
  17. uniapp禁止单页面侧滑返回
  18. php图片生成邀请函,科学网—如何制作邀请函 - 樊晓英的博文
  19. iOS UITextView 纯英文排版换行出错的解决方案
  20. 【Rust 日报】2022-10-16 全栈同构Web框架leptos

热门文章

  1. CodeForces - 670C Cinema(离散化+排序/map,水题)
  2. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)
  3. 2019ICPC(南昌) - The Nth Item(矩阵快速幂)
  4. POJ1279(求多边形内核的面积)
  5. WinSock编程基础
  6. Windows系统程序设计之结构化异常处理
  7. leetcode-260.只出现一次的数字 III 解法
  8. 从 DevOps 到 Serverless
  9. GitHub被中国人霸榜!国外开发者不开心了
  10. Python中的进程间通信