本人大四即将结束,于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这两个作为子数组。再进行处理就行了。
第七章其他部分,就是分析快速排序的时间复杂度,概念性东西太多,我这里不写了。
值得一提的就是后面有个随机快速排序算法。方法也很简单,就是在数组中随机选择一个主元,然后把他的位置,和最右边的数做一个调换,这样也是为了减小算法出现最坏情况的发生几率。
还有一个找主元的方法,就是随机选三个数,找这三个数的中位数,作为主元,然后再将它与最后一位数调换。