繁体   English   中英

在线性时间内对数组进行排序

[英]Sort an array in linear time

我被困在这个问题上:给定 [0, 1, ... , n^5 - 1] 范围内的 n 个整数数组,如何在线性运行时对它们进行排序? (O(n)) 更一般地说,如果范围是 [0, 1, ... , n^c - 1] (c 是一个大于 1 的自然常数),你会怎么做? 描述一个正确的算法并解释。 我的第一个想法是在这两种情况下都将数字转换为基数 n,然后使用基数排序(使用计数排序作为排序算法),但有人告诉我我不能指望从以 n 为底数的十进制底数是 O(1) 所以基本上我很困惑,因为我不知道我能做到......很乐意提供帮助。

提示:桶排序是一种稳定排序 所以如果你按条件 A 排序,然后求助于条件 B,你最终会先按 B 排序,然后再按 A 排序。

让我们使用//表示 integer 除法(去掉余数),使用%表示余数。 现在,如果您按x % m排序,然后按(x // m) % m对 output 进行排序,您将得到一个按基数b的最后 2 位数字排序的列表。

这足以让你继续吗?

术语“整数”意味着值存储为二进制数,而不是十进制数。 由于它们是二进制数,因此使用的基数是 2 的幂,例如 256,这很常见。 在固定时间使用shift and and而不是 divide。

对于线性时间复杂度 O(n),代码应根据 integer 中的位数进行排序,通常为 32 位,因此需要 1 次扫描和 4 次基数排序。 由于 1 和 4 是常量,时间复杂度是 O(n)。 如果优化排序以减少基于范围的基数排序遍历次数,虽然速度更快,但时间复杂度为 O(n log(range))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM