所谓“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解,这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。
分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以:
- 把它分成两个或多个更小的问题;
- 分别解决每个小问题;
- 把各小问题的解答组合起来,即可得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。分而治之方法可以用于实现不同的排序方法,这里介绍两种排序法:快速排序(quick sort) 。
算法思想
在快速排序中,n 个元素被分成三段(组):左段left,右段right 和中段middle。中段仅包含一个元素。左段中各元素都小于等于中段元素,右段中各元素都大于等于中段元素。因此left 和right 中的元素可以独立排序,并且不必对left 和right 的排序结果进行合并。middle 中的元素被称为支点( pivot )。下面给出快速排序的伪代码。
使用快速排序方法对a [ 0 : n- 1 ] 排序。
从a [ 0 : n- 1 ] 中选择一个元素作为middle,该元素为支点把余下的元素分割为两段left 和right,使得left中的元素都小于等于支点,而right 中的元素都大于等于支点。
递归地使用快速排序方法对left 进行排序。
递归地使用快速排序方法对right 进行排序。
所得结果为left + middle + right。
考察元素序列[ 4 , 8 , 3 , 7 , 1 , 5 , 6 , 2 ]。
假设选择元素6 作为支点,则6 位于middle;4,3,1,5,2 位于l e f t;8,7 位于right。当left 排好序后,所得结果为1,2,3,4,5;当right 排好序后,所得结果为7,8。把right 中的元素放在支点元素之后,left 中的元素放在支点元素之前,即可得到最终的结果[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] 。