【考研】数据结构考点——快速排序(重点,含408真题)

​前言

 本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结。

交换排序的基本思想:两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止。

交换排序的主要两种方法:冒泡排序、快速排序

本文内容主要针对快速排序。(快排,要求要掌握其算法,是考研中的重点考查内容)

在本文最后的练习中,以举例子说明该排序方法,配以图文,讲解详细(含408真题)。

本文“干货”较足,建议收藏。可搭配以下链接一起学习:

【考研】数据结构考点——冒泡排序(含408真题)_住在阳光的心里的博客-CSDN博客

【考研】《数据结构》知识点总结.pdf_考研数据结构知识点总结背诵-其它文档类资源-CSDN文库

目录

​前言

一、快速排序(Quick Sort)基本概念 

二、算法步骤及代码

(一)算法步骤

(二)算法代码

三、算法分析及特点

(一)算法分析

(二)算法特点

四、练习


一、快速排序(Quick Sort)基本概念 

是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序

如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序
 

二、算法步骤及代码

(一)算法步骤

在待排序的 n 个记录中任取一个记录 (通常取第一个记录)作为枢轴(或支点),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于 pivotkey 的记录交换到前面,把所有关键字大于pivotkey 的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放置在分界处的位置然后,分别对左、右于表重复上述过程,直至每子表只有一个记测时,排序完成。

其中,一趟快速排序的具体步骤如下。

1、选择待排序表中的第一个记录作为枢轴,将枢轴记录看存在 r[0] 的位置上。附设两个指针 low 和 high,初始时分别指向表的下界和上界(第一趟时,low = 1; high = L.length)

2、从表的最右侧位置依次向左搜索,找到第一个关键字小于枢轴关键字 pivotkey 的记录,将其移到 low 处。具体操作是:当 low < high 时,若high所指记录的关键字大于等于 pivotkey,则向左移动指针 high (执行操作 --high );否则将 high 所指记录移到 low 所指记录。

3、然后再从表的最左侧位置,依次向右搜索找到第一个关键字大于 pivotkey 的记录和枢轴记录交换。具体操作是:当 low < high 时,若 low 所指记录的关键字小于等于 pivotkey,则向右移动指针low (执行操作 ++low );否则将 low 所指记录与枢轴记录交换。

4、重复步骤二和三,直至 low 与 high 相等为止。此时 low 或 high 的位置即为枢轴在此趟排序中的最终位置,原表被分成两个子表。

在上述过程中,记录的交换都是与枢轴之间发生,每次交换都要移动 3 次记录,可以先将枢轴记录暂存在 r[0] 的位置上,排序过程中只移动要与枢轴交换的记录,即只做 r[low] 或 r[high] 的单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上。
 

(二)算法代码

// 对顺序表 L 中的子表 r[low..high] 进行一趟排序,返回枢轴位置
int Partition(SqList &L, int low, int high){
    L.r[0] = L.r[low];     //用子表的第一个记录
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

住在阳光的心里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值