参考自邓俊辉-dsacpp-3rd-9.4.1-散列应用
针对的问题:
n个互异的整数,并且每一个整数都在[0, M)之间,n<=M.
那么,可以用比nlogn更短的时间完成排序。
模拟的例子:
操作过程如下:
- 引入长度为M的散列表;
- 使用散列函数-hash(key)=key,散列n个元素到散列表里;
- 顺序遍历散列表,输出非空桶即可
整体时间复杂度为:初始化长M的散列表-O(M),散列n个元素-O(n),遍历散列表-O(M),总体运行时间O(n+M)。
允许重复元素
散列表+链表来允许重复元素。
处理散列冲突,采取链表法。只需要在遍历的时候将非空桶的独立链一次串联起来即可,也可以保证算法的稳定性。
总体复杂度不变,仍然只需要维护散列表而使用O(M)的额外空间。
基数排序
上面桶排序散列表的关键码是整数,但是还存在其他类型的关键码,比如字典序,日期型等等。
低位优先的多趟桶排序
假设关键码由{k1, k2, ..., kn}等n个字段组成,优先级升序排序。
那么,如果我们按照优先级递增的顺序对每一个字段进行一次桶排序,,即可实现对关键码字典序的排序。
例子:
整数的关键码-百位,十位,个位,优先级降序,个位最低:
数学归纳法证明正确性: