数据结构定义和算法--排序--优化

本文探讨了如何在不同场景下选择合适的排序算法,如线性排序的局限性、O(nlogn)算法的优选(快排与归并排序),以及优化快速排序的方法,如三数取中和随机分区。还介绍了通用排序函数的实现技巧,包括数据量优化、避免堆栈溢出和特殊情况下的O(n^2)算法应用。
摘要由CSDN通过智能技术生成

排序算法一览表

如何选择合适地排序算法

  1. 线性排序时间复杂度很低,但是其使用场景特殊。因此,如果要写一个通用的排序函数,不能选择线性排序;
  2. 为了兼容任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数;
  3. 同为时间复杂度为O(nlogn)的排序算法,选择快排而不选择归并排序是,因为归并排序不是原地排序算法;

如何优化快速排序

  1. 三数取中法:从区间的首、尾、中分别取一个数,取中间值作为分区点;如果排序规模太大,三数取中已经不够了,就要改为5数取中甚至10数取中;
  2. 随机法:每次从要排的区间随机取出一个数值作为分区点;
  3. 警惕快排递归堆栈溢出由两种解决方法:a.限制递归深度,一旦超过深度阈值,就停止递归;b.在堆上模拟实现一个函数调用栈,手动实现递归压栈、出栈过程,这样就没有系统栈大小限制;

通用排序函数实现技巧

  1. 数据量不大时,可以采用空间换时间的思路;
  2. 数据量大时,优化快排分区点的选取;
  3. 防止堆栈溢出,可以选择在堆上手动模拟调用栈解决;
  4. 当元素小于某个常数时,可以考虑使用O(n^2)复杂度排序算法;
  5. 用哨兵简化代码,每次排序都减少一次判断;

《数据结构与算法之美》 -- 王争

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值