思想:用首元素作为划分标准,设定两个指针,分别从第二个元素和最后一个元素分别往前往后遍历。
当前指针找到大于标准、后指针找到小于标准的时候,互换两个指针处的元素。从而将问题划分为两个子问题。
在递归调用对子问题排序。
伪代码:
算法:QuickSort(A, p, r)
输入:数组A[p...r] 输出:排序后的数组
1.if(p<r)
2.x <- A[p]
3.i <- p j <- r+1
4.while true do
5. repeat j <- j--
6. until A[j] <= x
7. repeat i <- i++
8. until A[i] >= x
9. if i < j
10. A[i] <-> A[j]
11. else return j
12.A[p] <-> A[j]
13.QuickSort(A, p, j-1)
14.QuickSort(A, j, r)
时间复杂度分析
W(n) = W(n-1)+n-1 W(1) =0
当子问题划分均衡时,取到最好划分,时间复杂度为nlogn
平均时间复杂度O(nlogn) 最坏时间复杂度O(n^2)
幂乘算法
将问题划分为相等的两个子问题,由于两个子问题完全相同,故计算一次即可,减小计算量。
斐波那契数列:可以通过行列式的方法化简为幂乘算法。复杂度:O(n) -> O(logn)
芯片测试:
对好芯片比坏芯片多一片的情况适用。
将n片芯片两两分组,互相测试,只留下好好的结果。
伪码:
Test(n)
1.K <- n
2.while k>3 do
3.将芯片分为k/2组 //对n为奇数的情况增加轮空处理
4.for i = k to k/2 do
5. if 两片好 留下一片 else 丢掉
6.k <- 剩下芯片数
7.if k = 3 then 任取两片测试
8. if 1好1坏 then取未测的芯片
9. else 任取一片被测
10.if k = 2 or 1 then 任取
时间复杂度:
W(n) = W(n/2) + O(n) W(3) = 1, W(2)=W(1)=0
W(n) = O(n)
改进分治算法的途径
1、减少子问题数
W(n) = aW(n/b) + d(n)
当a较大,b较小,d(n)不大时,方程的解W(n)与n^logba 同阶
减少a是降低函数复杂度的途径。
2、增加预处理
分组等