“学习笔记”之《算法导论》----第二部分----排序和顺序统计量----第七章----快速排序

本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接

放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。

这一章介绍了快速排序的方法,它比上一章介绍的堆排序方法要好。虽然它的最坏的情况下时间复杂度为θ(n^2),但是它的平均时间复杂度为θ(nlgn),而且能够进行原址排序。

快速排序的思想,是分治策略,但是它的原理有些复杂。下面我来简述一下:

还是说把一个乱序的一维数组,从小到大排好。

之前我分析过递归,重点就是怎么处理子问题,注意递归函数的形参以及实参,这里我就说一下处理方法。

把一个数组(也可以想象是一个子数组)最右边的数拿出来,将这个数标记为主元,然后呢,就是把这个数组中所有小于主元的数放在右边(他们的顺序无所谓),所有大于主元的数放在右边(顺序也无所谓)。之后呢,就是再对子子数组调用算法。下面是举例说明

                                                               第一次执行----找主元,4就是主元,设置为蓝色

2

9

5

3

4

第二次执行----从左往右一个一个元素比对,这里声明,比主元4小的就是绿色,比4大的就是红色,没有比较的就是黑色

2

9

5

3

4

                                                                                              第三次执行

2

9

5

3

4


                                                                                              第四次执行

2

9

5

3

4

                                                                                             第五次执行(1)

2

9

5

3

4

                                                                第五次执行(2)----注意这里,3和9互换了位置!!!!!

2

3

5

9

4

                                            第六次执行----因为没有待比较的了,所以就把主元放在他们之间,4和5调换

2

3

4

9

5

​​​​

 后续步骤就是把2、3这两个作为子数组,9、5这两个作为子数组。再进行处理就行了。

第七章其他部分,就是分析快速排序的时间复杂度,概念性东西太多,我这里不写了。

值得一提的就是后面有个随机快速排序算法。方法也很简单,就是在数组中随机选择一个主元,然后把他的位置,和最右边的数做一个调换,这样也是为了减小算法出现最坏情况的发生几率。

还有一个找主元的方法,就是随机选三个数,找这三个数的中位数,作为主元,然后再将它与最后一位数调换。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Naruto

你的鼓励是我的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值