B站左程云算法视频笔记04

排序算法的稳定性

稳定性是指:排序时值相同的元素在排序后能否保证其相对次序不变(可理解为网购时先将价格由低到高排列,在以质量好坏进行排序,实现物美价廉)

时间复杂度空间复杂度稳定性
选择排序O(N^{2})O(1)×
冒泡排序O(N^{2})O(1)
插入排序O(N^{2})O(1)
归并排序o(N\log N)o(N)
快排(3.0)o(N\log N)o(logN)×
堆排序o(N\log N)O(1)×

分析:

1.前三个排序都是基于比较的排序,基于比较的排序的时间复杂度不能做到<o(N\log N)

 2.时间复杂度o(N\log N)的三个算法不能兼顾空间复杂度小和稳定性。在实际设计时,一般选择快排,因为其时间复杂度常数项较小,速度较快,考虑稳定性选择归并排序,有空间限制,选择堆排序。

 坑:

1.归并排序的额外空间复杂度可为o(1),但会因此丧失稳定性,“内部缓存法”,较难

2.原地归并排序可以使得空间复杂度为o(1),但会使得时间复杂度为O(N^{2})

3.快排可以做到稳定性,但会使得空间复杂度为o(N)

题目:奇数放数组左边,偶书放数组右边,且要求原有的相对次序不变。(这是一个0-1问题,快排无法达到,因为其进化过程做不到稳定性)

工程上对排序的改进:大样本,调度时一般选择快排,小样本时,选择插入排序。综合排序,利用各自的优势(时间快,空间低,以及稳定性的考虑)

Java中的Array.sort()在基础类型时选择快排,非基础类型时选择归并保持稳定性

哈希表

HashSet <key> 由增(add)、删(remove)、查(contains)

HashMap<key,value> value是伴随数据,排序组织以key来

HashMap由增/更新(add)、删(remove)、查(containkey)、拿(get)key的value

哈希表的时间复杂度是常数级别的,能实现增删改查功能

有序表

有序表的性能比哈希表差,是o(logN)

和哈希表一样,分为TreeSet和TreeMap,内部按照Key来组织排序

注意:当放如有序表的东西是基本数据类型的时候,可以实现比较。当放入有序表的东西不是基本数据类型时,要提供比较器

操作:

1.put(k key, V value) :将(key,value)加入表中,也可实现将key更新成value

2.V get(k key):根据key查询value返回

3.remove(k key):删去key的记录

4.boolean containskey(k key):查

5.k firstkey:所有键值的排序结果中,最小(左)的那个

6.k lastkey:所有键值的排序中,最大(右)的那个

7.k floorkey(k key):如果表中存过key,则返回key,否则返回所有键值的排序结果中,key的前一个(小于等于)

8.k ceilingkey(k key):大于等于(后一个)

链表

重要技巧:额外数据结构记录(哈希表)、快慢指针

题目

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值