集划分在上一篇日志中讲快速排序的实现思路时已经讲到,这里先再用一个简单的例子来回顾一下子集划分,假设我们的待排序列是这样:
假设我们已经做好了选枢轴的操作,并且把枢轴放到了Right-1的位置了,也就是图中的49。接着设置两个指针,指向待排序列的第一个位置和最后一个位置,然后就可以开始子集划分了。
- 第一步首先从Low指针开始往右遍历,如果遇到比枢轴大的元素,Low指针就停止。这时发现Low指向的27比49小,Low就往左移动,38也比49小,继续往前,直到Low遇到65,66比49大,那么Low指针就停下来,指向65的位置。
- 第二步到从High指针开始往左遍历,如果遇到比枢轴小的元素,High指针就停止遍历。97比49小,High指针减减,76也比49小,High指针继续减减。
- 直到High指针遇到13,就停下来。当Low和High指针都做完遍历操作后,就把两个指针的元素进行交换。
- 做完交换后,就可以进行下一轮的遍历,也就是重复1-3的步骤。Low指针继续往左遍历,指向了65,发现65比49大,Low指针停了下来;到High指针往右遍历,发现13比49小,High指针也停了下来。
- 此时Low指针和High指针错位了,所以这一轮快速排序就该结束了,由图我们可以看到,枢轴的正确位置明显在Low指针的位置,因为枢轴49放到Low指针指向的位置后,49左边的元素都比它大,右边的与元素都比它小,一轮快排的最后一步就是把枢轴放到Low指针的位置。
以上就是子集划分的过程,接下来对枢轴49左右两个子序列用递归的方式继续做子集划分即可。这样看来是不是很像归并排序?
快速排序之所以快的原因就是,每一轮快速排序中以枢轴为界做完子集划分之后,最后枢轴都会被换到正确的位置上,且之后不会再移动!!为什么?因为每一轮快速排序都是以上一个枢轴