快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是
- 先从数列中取出一个数作为基准
- 将比这个数大的放到右边,小的都放到左边
- 重复1,2步,直到各个区间最终只剩下一个数
以一个数组作为示例,取区间第一个数为基准数。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到了X中,可以理解成在a[0]上面挖了个坑,可以将其他数据填充到这里来。
从j开始向前找一个比x小或者等于x的数,当j=8,发现符合要求。将a[8]挖出来再填到上一个坑a[0]中。
a[0] = a[8]; i++
这样第一个坑a[0]就被搞定了,但是又形成了一个新坑a[8],因此需要再找一个数字填充这个坑,这次从i开始向后找一个大于X的树,i=3的时候符合要求,将a[3]挖出来再填到坑a[8]中,j–;
数组变成了
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 88 | 85 |
i = 3; j = 7; X=72
再次重复上面的步骤,直到最后,可以得到
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
48 | 6 | 57 | 42 | 60 | 72 | 83 | 73 | 88 | 85 |
第一趟结束,可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。接下来再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。
对快速排序进行总结
- i = L; j = R,将基准数挖出形成第一个坑a[i]
- j–,从后向前找到比他小的数,找到后挖出此数,田中到前一个坑a[i]中。
- i++,从前向后找比他大的数,找到后也挖出这个数填到前一个坑a[j]中。
- 再次重复2,3步,直到 i==j,将基准数填到该位置。