基数排序的空间复杂度_72、排序算法-桶排序和基数排序

参考自邓俊辉-dsacpp-3rd-9.4.1-散列应用

针对的问题:

n个互异的整数,并且每一个整数都在[0, M)之间,n<=M.

那么,可以用比nlogn更短的时间完成排序。

模拟的例子:

31605d0762a6f2aa40b9d3cda17834fd.png

操作过程如下:

  1. 引入长度为M的散列表;
  2. 使用散列函数-hash(key)=key,散列n个元素到散列表里;
  3. 顺序遍历散列表,输出非空桶即可

整体时间复杂度为:初始化长M的散列表-O(M),散列n个元素-O(n),遍历散列表-O(M),总体运行时间O(n+M)。

允许重复元素

a31035665376809abf89e830f49b03bf.png

散列表+链表来允许重复元素。

处理散列冲突,采取链表法。只需要在遍历的时候将非空桶的独立链一次串联起来即可,也可以保证算法的稳定性。

总体复杂度不变,仍然只需要维护散列表而使用O(M)的额外空间。

基数排序

上面桶排序散列表的关键码是整数,但是还存在其他类型的关键码,比如字典序,日期型等等。

低位优先的多趟桶排序

假设关键码由{k1, k2, ..., kn}等n个字段组成,优先级升序排序。

那么,如果我们按照优先级递增的顺序对每一个字段进行一次桶排序,,即可实现对关键码字典序的排序。

例子:

整数的关键码-百位,十位,个位,优先级降序,个位最低:

911871715a02d45bb545ad3ff28ba3f2.png

数学归纳法证明正确性:

b77f2df31d3f682edcbecfb0ab15d7ad.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值