在线性时间内对 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 个数字进行排序的主要内容,如果未能解决你的问题,请参考以下文章