1、三路快速排序算法的基本思想
之前的快速排序算法都是将序列分成<=v和>v或者是<v和>=v的两个部分,而三路快速排序是
将序列分成三个部分:<v、=v、>v,如下图所示:
首先v元素还是作为"基准"元素,e表示当前遍历索引值指向的元素,也就是待考虑的元素,从图中可以
看出来,整个序列被分成3个部分,也就是说当我们遍历完成之后整个序列就已经被分成了<v、=v、>v
三个部分了,而我们只需要对<v和>v的两个部分再次递归调用三路排序函数进行排序即可,来看看具体
的过程:
首先来看看整个序列的布局,这里我们使用了3个索引值来表示3个不同的位置,使用lt索引来表示
<v部分和=v部分的分界处(这里选的是<v部分的最后一个元素),使用i索引表示遍历的位置,
使用gt索引来表示=v部分和>v部分的分界处(这里选的是>v部分的第一个元素)。
如果当前i指向的元素=v,那直接就将此元素归为=v部分,i++即可
如果当前i指向的元素<v,将此元素与=v部分的第一个元素
交换位置,也就是swap(arr[i], arr[lt+1]),之后将lt++,
i++即可,此时<v部分就多了一个元素
如果当前i指向的元素>v,则将此元素与>v部分的第一个元
素的前一个元素交换位置,也就是swap(arr[i], arr[gt-1]),
然后gt--,表示>v部分多了一个元素此时i不用动,因为他指
向的元素是交换过来的,这个元素还没有遍历到。
当gt与i重合的时候就表示便利完毕了,那么此时我们只需要
将l指向的元素v与lt交换位置即可,之后就如下所示了
之后我们只需要对<v和>v这两部分再次递归进行三路排序,而对于=v的部分就不用在考虑了,因为他们
已经放在了合适的位置了,所以从这里可以看出来如果=v部分元素非常多,那么我们的三路快速排序算法
效果就会越明显,这也正是他的优点所在。
2、三路快速排序算法的实现(基于C++)
首先说明,代码中使用到的索引值变量都是取之于上面的图示中,这样便于描述问题