仅用于记录学习,欢迎批评指正,大神勿喷
系列文章目录
《算法图解》总结第 1 章:二分查找、大O表示法;
《算法图解》总结第 2 章:数组和链表,选择排序;
《算法图解》总结第 3 章:while循环、递归、栈;
《算法图解》总结第 4 章:分而治之、快速排序;
《算法图解》总结第 5 章:散列表;
《算法图解》总结第 6 章:广度优先搜索;
《算法图解》总结第 7 章:狄克斯特拉算法;
《算法图解》总结第 8 章:贪婪算法
《算法图解》总结第 9 章:动态规划
《算法图解》总结第 10 章:K最近邻算法
《算法图解》总结第 11 章:十种算法简介
分而治之(D&C)
使用D&C解决问题的过程包括两步:
(1)找出基线条件,这种条件必须尽可能简单;
(2)不断将问题分解(或者说缩小规模),直到符合基线条件。
举例说明:将一块640m*400m的地均匀地分成方块,并确保分成的方块是最大的。
首先先找出基线条件,最容易处理的情况是一条边的长度是另一条边的整数倍;再找出递归条件,这是D&C的用武之地,每次递归调用都必须缩小问题的规模。即首先找出这块地容纳的最大方块,对于640m*400m的地,从中划出最大的方块为400m*400m,余下400m*(640-400=240)m的地,在这块剩余的地中再划出最大的方块240m*240m的地,余下240m*(400-240=160)m的地,再在这块地中划出最大的方块160m*160m的地,余下160m*(240-160=80)m的地,余下的这块地满足基线条件,因为160是80的整数倍。因此对于最初的那块地,最大的方块为80m*80m。
将此思路(递归)用于解决数组的求和问题,用Python编码实现如下:
快速排序
快速排序是一种常用的排序算法,比选择排序快很多,快速排序也使用了D&C。下面使用快速排序对数组进行排序。
基线条件:数组为空或者只有一个元素时,不用排序,返回数组即可。当数组中的元素大于等于2时,要使用D&C将数组分解,直至满足基线条件。
快速排序的工作原理:
(1)从数组中选择一个元素,这个元素被称为基准值,即选择基准值(快速排序的速度取决于基准值的选择);
(2)将数组分成两个子数组:小于基准值的元素和大于基准值的元素;
(3)对这两个子数组进行快速排序。
算法实现:Python
其他内容小结
(1)大O表示法中的常量(算法所需的固定时间量)有时候事关重大,这就是快速排序比合并排序快的原因所在。
(2)比较简单查找和二分查找时,常量几乎无关紧要。