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

本人大四即将结束,于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这两个作为子数组。再进行处理就行了。

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

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

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

你可能感兴趣的:(算法导论)