在线性时间内对 0 到 n^2 – 1 范围内的 n 个数字进行排序

Posted

技术标签:

【中文标题】在线性时间内对 0 到 n^2 – 1 范围内的 n 个数字进行排序【英文标题】:Sorting n numbers in range from 0 to n^2 – 1 in linear time 【发布时间】:2021-05-04 06:28:42 【问题描述】:

使用两次计数排序如何对数组的元素进行排序?

是否会使用两次精确计数排序?

我知道它与基数排序(这是计数排序的子程序)有关,其中元素通过一次考虑每个数字进行排序。

更多详情:- https://www.geeksforgeeks.org/sort-n-numbers-range-0-n2-1-linear-time/

(请不要将其声明为重复我已经检查过与此相关的帖子。)

将数字转换为基数 n 后,元素将如何成为两位数?请告诉我这个好吗?

提前致谢。

【问题讨论】:

重复与否,真的不清楚你在问什么。如果您的问题是n 中的基数排序线性,答案是肯定的。参见***——en.wikipedia.org/wiki/Radix_sort。 @semisecure 嘿再次检查,我已附上帖子的链接。 @semisecure 基数排序的运行时复杂度(即:比较次数)(由您链接到的***文章正确描述)是 O(n * w) 其中 n 是元素的数量,并且w 是元素的宽度。这里w是2log_2(n),所以这里未修改的基数排序是O(n log n),不是线性的。 【参考方案1】:

文章中描述的技巧是将数组的元素视为以 n 为底的 2 位数字,并使用两次计数排序对它们进行排序。

这个想法是按底部数字对数字进行排序(使用稳定的排序算法),然后按较高的数字对数字进行排序(使用相同的稳定排序算法)导致数字被排序。这两个步骤可以认为是基数排序的一种形式,除了它不是按位排序,而是按数字基数排序。

鉴于数字都在 0..n-1 范围内,因此可以使用计数排序在线性时间内完成两个排序步骤中的每一个。为了使计数排序稳定,需要处理一些繁琐的细节,但文章中提供了这些细节(和代码)。

【讨论】:

在将数字转换为基数 n 后,元素的两位数如何?请告诉我这个好吗? 以 n 为底的最小 3 位数字是 n^2。 @AbhishekJaiswal 如果你有 x=<0,n*n-1> 的价值,那么你可以把它分成 2 位数字(低、高两半):xl=x%n; xh=x/n; 如果我看对了,唯一可行的方法是你的字典(每个第一个数字的一​​组直方图)是 static 二维数组!!!但这将占O(n) 时间和O(n^2) 空间。 但你必须忽略直方图字典的初始化,因为即使使用 memset 也只是清除它是O(n^2)

以上是关于在线性时间内对 0 到 n^2 – 1 范围内的 n 个数字进行排序的主要内容,如果未能解决你的问题,请参考以下文章

斐波拉契数列加强版——时间复杂度O,空间复杂度O

shell生成指定范围内的随机数

在线性时间内创建图案化阵列 [重复]

338. 比特位计数

338. 比特位计数

338. 比特位计数