排序(四)排序优化

几种排序算法

时间复杂度是否稳定是否原地排序
冒泡排序O(n²)稳定
插入排序O(n²)稳定
选择排序O(n²)不稳定
快速排序O(nlogn)不稳定
归并排序O(nlogn)稳定不是
计数排序O(n+k),k是数据范围稳定不是
桶排序O(n)稳定不是
基数排序O(dn),d是维度稳定不是

排序算法的选择

虽然线性排序时间复杂度比较低,但是适用场景特殊条件苛刻,所以不能选用线性排序作为通用排序算法。

对于小规模数据可以选择时间复杂度为O(n²)的算法,在小规模数据面前,O(n2) 时间复杂度的算法并不一定比 O(nlogn) 的算法执行时间长;对于大规模的数据,可以选用时间复杂度为O(nlogn)的算法。为了兼顾任意规模的数据,会选择时间复杂度为O(nlogn)的算法,其中包括:归并排序、快速排序、堆排序等。

归并排序在平均、最坏时间复杂度上都为O(nlogn),但是归并排序不是原地排序,当需要排序的数据比较大时,就为占用额外过多内存,显然不合适。快速排序是原地排序,但最坏情况时间复杂度退化为O(n²)。

优化快速排序

**分区点:**选取分区点不够合理,导致数据全部分到一边,时间复杂度就会变为O(n²),所以优化的关键在于分区点的选取。

  • 三数取中法:取开头、结尾和中间数据,求平均值作为分区点
  • 随机发:从概率学的角度,不太可能出现每次都选到最差分区点的情况

**递归问题:**快速排序是用递归实现的,递归过程中可能出现堆栈溢出。

  • 限制递归深度
  • 在堆上手动模拟一个函数调用栈,手动模拟递归入栈出栈,这样就没有栈大小限制(堆是内存中最大的一块)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值