快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。这种快速排序算法都是将序列分成<=v和>v或者是<v和>=v的两个部分。

三路快速排序

当待排序元素序列中有大量的重复排序码时,简单的快速排序算法的效率将会降到非常之低。这时候三路快速排序就起到了作用,三路快速排序是将序列分成三个部分:<v、=v、>v,如下图所示:
三路快排(快速排序优化)
首先v元素作为"基准"元素,e表示当前遍历索引值指向的元素,也就是待考虑的元素,整个序列被分成3个部分,也就是说当我们遍历完成之后整个序列就已经被分成了<v、=v、>v三个部分了,而我们只需要对<v和>v的两个部分再次递归调用三路排序函数进行排序即可。
三路快排(快速排序优化)
具体过程如下
三路快排(快速排序优化)
当i指向的元素e==v,直接就将此元素归为=v部分,i++即可

三路快排(快速排序优化)
当i指向的元素e<v,将此元素与=v部分的第一个元素交换位置,之后将lt++,i++即可,此时<v部分就多了一个元素

三路快排(快速排序优化)
当i指向的元素e>v,则将此元素与>v部分的第一个元素的前一个元素交换位置,然后gt–,表示>v部分多了一个元素此时i不用动,因为他指向的元素是交换过来的,这个元素还没有遍历到

三路快排(快速排序优化)
当gt与i重合的时候就表示遍历结束,此时只需要将l指向的元素v与lt交换位置即可,如下图:
三路快排(快速排序优化)
之后我们只需要对<v和>v这两部分再次递归进行三路排序,而对于=v的部分就不用在考虑了,因为他们已经放在了合适的位置了,所以从这里可以看出来如果=v部分元素非常多,那么我们的三路快速排序算法效果就会越明显,这也正是他的优点所在。

LeetCode上的75号问题–颜色分类–就可以很好的使用三路快排的方法解决。

超链接:
https://blog.csdn.net/weixin_44217401/article/details/104454906

相关文章: