排序新思路,实现时间O(n)复杂度

在常用的几大排序算法中,归并排序(O(nlogn)),冒泡排序(O(n^2)),快速排序(O(nlogn)),堆排序(O(nlogn)),最低的排序复杂度都是O(nlogn),这是由于我们假定排序的数对应的范围都是极大且不确定的,比如我们需要对int范围的数组进行排序(-2147483648-2147483647),大概40亿个数,一个int型数占4个字节,一共需要消耗4*40亿个字节=1.6Gb的内存才能放下,也就是说如果沿用哈希表来存放,考虑到每一个数都存在被选中的情况,需要把1.6Gb的数据加载进内存,这无疑低效率的。对于这样的排序,由于范围很大,所以常见的排序算法的复杂度都是假定当n极大时的时间复杂度。对于已知范围且范围跨度不大的数据排序我们可以用哈希表的思想把复杂度降到O(n)。但是有两大前提:需要辅助空间+必须提前知道待排序的数范围,这在面试中可能会被面试官问到,特作此记录。

这里以一道题举例:我们需要对公司的员工按照年龄排序,这道题有两大特点:年龄的分布范围是已知的在(0-200),我们可以申请辅助空间。具体思路如下:首先需要申请一个大小为200的int[]的数组,初始化int[]数组的值为全0,然后遍历员工,假设员工的年龄为3,则我们把辅助数组a下标为i-1的数值+1,当遍历完员工后,在辅助数组中对应的i-1的值便不断累加。最后遍历辅助数组中不为0的数值就是答案。比如原数组为[2,6,20,1,76,6],则最后辅助数组a的值如下:


辅助数组a的其他下标的值都为0,则最后由小到大遍历不为0的数即可。这里用到了哈希表的思想,因为哈希表的key的查找效率为O(1),和数组直接访问下标的效率相同,只不过哈希表的key是通过哈希函数计算映射并通过一系列避免key值冲突的算法优化而成。

猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/80422735