一.前言
分治算法:通常我们将规模为n的原问题归为规模大概减半的子问题,分别求解每个子问题,最后进行综合,从而得到原问题的解。(子问题可以是很多个)
而今天介绍的快速排序法就是一个典型的分治算法的问题。
二.分析快速排序法
1.基本思想
我们将一个需要被排序的数组A的首个元素作为标准,将数组分为前后两个部分,比首元素小的构成数组的前部分,比首元素大的构成数组的后部分。这两个部分构成两个子问题,然后分别对这两个部分进行递归地排序,最后将所有子问题综合即可完成数组A的递增的排序。
2.实例分析(便于理解)
现有数组如下:25 22 20 26 24 28 27
将25为标准,从第一个22开始比较,比25小,应该在数组前部,第二个20比25小,应该放在数组前部,第三个26比25大,应该放在数组后部
此时我们开始从后往前找最后一个数据27比25大,应该放在数组的后部,倒数第二个数据28比25大,应该放在数组的后部,倒数第3个数据24比25小,应该放在数组前部
此时我们就将26与24交换位置
交换结果如下:
接下来我们继续
从第四个数开始(之前的三个数已经确定比25小,要放在数组的前部)发现是24是我们刚刚交换过的数据此时我们已经将数组里的所有数据都遍历过一遍了。
然后我们将24与25交换位置(这样操作就确保25的前部份全是比25小的数据,25的后部分全是比25大的数据)
交换后的数组是现在的情况
此时我们以25为界限可以将数组分为两个部分
24 22 20 和 26 28 27
然后我们再分别对这两个数组重复上述操作一直递归下去直到子问题的规模为1时终止
然后我们将所有的子问题进行综合即可。
3.伪代码
(1)Qucksort(X,y,z)
输入:数组X[y,z],1<<y<<z //y,z分别为数组X的首元素和尾元素的下标
输出:从X[y]到X[z]按照递增顺序排好序的数组X
1. if y<z
2.then a<-Partition(X,y,z) //将数组一分为二,a为首个元素X[y]排好序后的位置
3.X[y]<->X[a]
4.Quicksort(X,y,a-1)
5.Quicksort(X,a+1,z)
(2)Partition(X,y,z)
输入: 数组X[y,z]
输出:a //X的首元素在排好序的数组中的位置
1.b<-X[y]
2.i<-y
3.j<-z+1
4.while true do
5.repeat j<-j-1 //从前往后遍历
6.until X[j]<=b
7.repeat i<-i++ //从后往前遍历
8.until X[i]>b
9.if i<j
10.then X[i]<->X[j] //交换
11.else return j
4.代码实操
大家最好自己敲一遍练习一下
代码运行