数据结构初阶——排序算法

插入排序

  1. 有序或者接近于有序的序列,插入排序的效率很高

时间复杂度——O(N^2)

希尔排序

希尔排序是优化后的插入排序,要先进行预排序,然后再进行插入排序
  1. 预排序是将间隔为gap的数据分为一组,进行插入排序

  1. gap越大,就会更快的隔着gap进行跳跃;gap越小,越有序

  1. 插入排序是gap为1的希尔排序

  1. gap的确定:一种是gap/2,一种是gap/3+1,两种都能保证gap一定最后到1

  1. 逆序的序列希尔排序效率很高

时间复杂度——O(N^1.3)

直接选择排序

每一轮选择最小的和最大的,遍历整个数组
  1. 无论数据是否有序,时间复杂度相同

时间复杂度——O(N^2)

冒泡排序

  1. 有序或者接近于有序的序列,插入排序的效率很高

  1. 最坏时间复杂度——O(N^2) 最好时间复杂度——O(N)

Hoare快速排序

  1. 选择一个key(一般是第一个或者最后一个)

  1. 单趟排序,要求小于key的在key左边,大于key的在key的右边

两个指针头尾相向移动,头指针找一个比key大的,尾指针找一个比key小的,互相交换,直到相遇,与key互换

头部为key,保证相遇位置值比key小——尾指针先移动(尾部做key的时候,头指针先动)

一趟排序确定key的最终位置,同时两个子区间分别递归使其有序

时间复杂度——O(N*logN)

最好情况——每一轮keyi正好都移动到中位数左右

最坏情况——整体大致有序 O(N^2)——可能会发生栈溢出

优化选择keyi

  1. 随机选择keyi

  1. 针对有序的情况,选择正中间的位置做keyi

  1. 三数选中——拿到头、尾和中间的中位数——不可能取到最值

  1. 小区间优化——最后几层改用插入排序

挖坑法快速排序

前后指针法快速排序

  1. cur指向的数据比key小,cur走,prev紧跟着走,同时交换

  1. cur指向的数据比key大,cur自己走

  1. key与prev交换

非递归快速排序(栈实现)

归并排序

  • 已经有序的两个区间,借助第三个数组,把小的值进行尾插

  • 先分解成有序的小区间进行合并——类似二叉树的后序遍历

  • 时间复杂度O(N*logN)

归并排序非递归实现

计数排序

  • 非比较排序,不比较数字的大小

  • 基数排序和桶排序运用实际运用较少

计数排序本质是通过统计次数进行排序

  1. 数组中每个位置的值是该下表对应的数字出现的次数——映射

  1. 根据出现的次数进行覆盖

为了节省空间,不使用直接映射而是间接映射

适合对范围相对集中的数据进行排序处理

时间复杂度 O(N + range)

空间复杂度O(N)

缺点——只能排序整数,不适合比较字符串或者浮点数

总结

  1. 排序注重思想和实现

  1. 复杂度及其稳定性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ta亻也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值