五分钟掌握快速排序

news/2024/5/19 23:07:34 标签: 快速排序, C语言, 数据结构与算法

       快速排序采用的分治法的思想,在数据量大的时候效率极高,所以在许多情景下都能能使用到,是必须掌握的排序方法。

 

       快速排序的基本思想是:

  • 先从数列中取出一个数作为基准数(我更喜欢叫标兵)
  • 进行分区,将比标兵大的数放到它右边,小于等于的数放到它的左边
  • 对两个分区重复第二步,直到各分区只剩一个数时退出

 

       在网上看的一篇博客用的是分治法加填坑法,讲的通俗易懂!将快速排序法理解为挖坑填坑的操作。假如对下面数组进行快速排序,我们来分析一下排序的过程。

 

0

1

2

3

4

5

6

65

23

88

12

77

69

26

 

       首先,取第一个数为标兵,这时left=0,right=6,refer=arr[0]=65

       这时refer缓存的是65,可以理解为在a[0]那里挖了个坑,后面就是填坑的操作。排序开始,right开始从后往前移动直到找到比refer小于等于的数,把这个数填到arr[0]那里,当right=6时,符合条件,于是arr[0]=arr[6],left++。这里left++是因为此时arr[left]肯定是小于refer的数了,下次就继续从下一个数开始,避免重复操作。这时arr[6]又产生了一个坑,下次轮到left从前往后找比refer(65)大的数,当left=2时,符合条件,把这个数填到arr[6]那个坑那里,arr[6]=arr[2],right--,这时arr[2]又产生一个坑。refer为65还不会变。这时left=3,right=5,不满足跳出循环的条件,继续下一轮。

 

0

1

2

3

4

5

6

26

23

88

12

77

69

88

 

       现在坑在arr[2]那里,refer=65,left=3,right=5,right继续从5那里right--找比65小的数,当right=3时,符合条件,于是arr[2]=arr[3],left++。这时新坑arr[3]出现啦,但是现在left(4)>right(3),符合条件跳出了循环,arr[3]的坑还没填,于是把标兵refer的值放在arr[3]那里(标兵归位),数组变为:

 

0

1

2

3

4

5

6

26

23

12

65

77

69

88

 

       这就保证arr[3]=refer=65那里,左边是比它小的数,右边是比它大的数,至此一轮排序完成。后面就继续递归调用本函数对arr[0…2]和arr[4…6]这两个子区间重复上述步骤就可以了。

 

对挖坑填数进行总结

  1. left =start; right = end; 将标兵挖出形成第一个坑arr[left]。
  2. right--由后向前找比它小的数,找到后挖出此数填前一个坑arr[left]中。
  3. left++由前向后找比它大的数,找到后也挖出此数填到前一个坑arr[right]中。
  4. 再重复执行b,c二步,直到left>=right,将标兵填入arr[left]中。

 

以下是实现代码:

 


http://www.niftyadmin.cn/n/948181.html

相关文章

C++为什么要定义抽象基类?

C为什么要定义抽象基类? 抽象类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象类不能被实例化,通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。 为什么要定义抽象基类呢?…

const全面总结

const 是C中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、const的作用 No. 作用 说明 参考代码 1 可以定义const常量 const int Max 100; 2 便于进行类型检查 const常量有数据类型&#xf…

传递对象和引用

值传递:有一个形参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象或是大的结构体对象,将耗费一定的时间和空间。 指针传递:同样有一个形参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个固定为4字节的地址…

解决Windows10开始磁贴重启重置

主要有两种可能 目前登录的Microsoft账户同步设置异常目前登录的是本地账户 【解决办法】 打开账户设置界面,开始点右键->设置->账户,观察自己的账户信息。 如果你登录的是本地账户,就创建一个Microsoft账号来登录,如果已…

串口UART

UART使用的是异步,串行通信 串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。 异步通信以一个字符为传输单位…

解决chrome谷歌浏览器访问网页过慢

近期使用Win10 1803专业版操作系统的用户称自己电脑在使用谷歌内核浏览器的时候打开网页速度非常慢的现象,左下角一直显示“正在建立安全链接…”的字样,在chrome、360极速模式下都有这样的现象,如果使用系统自带的ie或者是火狐等浏览器的话…

五分钟掌握时间空间复杂度

一、定义 在进行算法分析时,语句总的执行次数?(?)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度。记作:?(?)?(?(?))。它表示随问题n的增大,算法…

DS18B20使用详解

DS18B20单线数字温度传感器,支持“一线总线”接口,测量温度范围为-55摄氏度到125摄氏度,精度为0.5摄氏度。大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量。支持3V~5.5V的电压范围。 DS18B20中的温度传感器完成对温度的测量&#x…