快速排序以及优化

参考https://juejin.cn/post/6844904130813640711

快排优化小结

对快速排序的优化主要体现在基准值选取、数据集分割、递归子序列选取、其他排序算法混合等方面,换句话说就是让每次的分区尽量均匀且没有重复被处理的元素,这样才能保证每次递归都是高效简洁的。

影响快排性能的情况:

分区不均匀

  • 所选的基准值是序列的首元素且是序列中的最大值或最小值,导致其他元素都在基准值的一侧,另一侧没有;这种情况下每次划分子区间后只有一个指针在动,复杂度为O(n2)

  • 对于已经排序或者近乎有序的数据集合来说就可能出现这种极端情况。

  • 解决方法:保证每次分割子序列的时候都足够均匀,比如随机选取基准值,而不是每次都选取第一个或者最后一个

数据中有大量重复元素

  • 解决方法:三分区快排,小于区、等于区、大于区,每次从头到尾遍历一遍,维护小于区和大于区的边界,递归的时候递归小于区和大于区,中间的等于区不变

在实际过程中根据处理值与基准值的大小关系,进行相应分区合并和交换,再进行下标移动就可以了,实际中分三种情况,这也是写代码的依据:

  • 处理值e==p,将e合并到等于区,i++;
  • 处理值e<p,将e与(lt+1)位置的数据交换,扩展小于区lt++,等于区长度不变,相当于整体平移;
  • 处理值e>p,将e与(gt-1)位置的数据交换,扩展大于区gt--,此时i不变,交换后的值是之前待处理区的尾部数据;
    请在这里输入引用内容
全部评论

相关推荐

05-29 20:34
门头沟学院 C++
KarlAllen_直通春招版:得做好直接春招的准备。学历差的话,一是面试要求会比学历好的严格不少,二是就算面试通过了也会被排序。总之暑期和秋招对于学历差的就是及其不友好
点赞 评论 收藏
分享
重生我想学测开:嵌入式的问题,我准备入行京东外卖了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-10 15:24
高考前一晚在OPPO手机上设置了早上5:30的闹钟,然而闹钟并未按时响起。直到妈妈做好早餐后,在6:27打开手机才发现闹钟未触发,“气得早上饭都没吃”。资本家你赢了
永不遗忘:我来解释一下 :Oppo 手机晚上两点会自动进行系统更新,这个系统更新会重置掉所有设置好的闹钟,而且他也不会告诉你,而且只有 Oppo 会这样,华为苹果小米三星都不会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务