Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何对O(n)中给定范围的列表进行排序_Algorithm_Sorting - Fatal编程技术网

Algorithm 如何对O(n)中给定范围的列表进行排序

Algorithm 如何对O(n)中给定范围的列表进行排序,algorithm,sorting,Algorithm,Sorting,如果我有一个大小为n的列表,并且我知道列表中的数字将在1到2n之间,那么在最坏的情况是O(n)的情况下,我将如何解决它 我在想,如果它在1和n之间,我可以只取这个数字,然后用这个数字-1处的数组值交换它,但是如果有任何重复,它就不会排序 我曾考虑过一种类似的方法来处理数字在1到2n之间的列表,但我似乎无法理解。有什么帮助吗?您可以在这里使用基数排序。当您对输入有限制时,就像您的情况一样,它工作得很好。检查这里的算法-在您的情况下可以在O(n)中运行。看看维基百科的定义 计数排序是一种对对象集合进

如果我有一个大小为n的列表,并且我知道列表中的数字将在1到2n之间,那么在最坏的情况是O(n)的情况下,我将如何解决它

我在想,如果它在1和n之间,我可以只取这个数字,然后用这个数字-1处的数组值交换它,但是如果有任何重复,它就不会排序


我曾考虑过一种类似的方法来处理数字在1到2n之间的列表,但我似乎无法理解。有什么帮助吗?

您可以在这里使用基数排序。当您对输入有限制时,就像您的情况一样,它工作得很好。检查这里的算法-

在您的情况下可以在O(n)中运行。看看维基百科的定义

计数排序是一种对对象集合进行排序的算法 根据小整数的键;也就是说,它是一个整数 排序算法。它通过计算 具有每个不同的键值,并对这些计数使用算术运算 确定输出序列中每个键值的位置。它的 运行时间在项目数量和差异方面是线性的 介于最大和最小键值之间,因此它仅适用于 在按键变化不明显的情况下直接使用 明显大于项目数量


您通常需要一个非比较排序来在O(n)时间内进行排序,但这是在您已经获得某些信息的情况下进行的。有三种“主要”非比较排序算法可供选择:计数排序、基数排序和桶排序

如果知道输入是小整数,请使用计数排序。根据维基百科,“计数排序只适用于键的变化不明显大于项目数的情况。”

如果要排序的所有数字的整数数相同,则可以使用基数排序。例:211311122


桶排序似乎是您的最佳选择。您的方法听起来不错,但不需要1到2n的数组,每个数字都有索引。在bucket sort中,可以有一个1到20的数组,每个元素中都有类似链表的内容。因此,如果你把数字109放在索引10上,它可能对应于索引10。

你可以使用基数排序,计数排序,有很多O(n)排序

但问题是让你很容易

在Java中:

int [n] input = {your list of n numbers}; int [2*n] listinorder; int [n] output;

for (int i=0, i<2n, i++) listinorder[i] = -1; // set all values of listinorder to -1

for (int i=0, i < n, i++) listinorder[input[i]] = input[i]; // set the ith value of listinorder to i

int j=0;

for (int i=0, i<2n, i++) if (listinorder(i)  != -1) {output[j] = i; j++};
int[n]input={您的n个数字列表};int[2*n]listinorder;int[n]输出;

对于(int i=0,i n可以有多大?只要n不比列表的长度大多少,计数排序是目前为止最快的解决方案。这不是一个非常java的问题,因为…@SpiderPig n将是列表的大小,其中n可以是任意大小。对于这样一个定义良好的问题,计数比基数更好。“listinorder[i]=i”-假设任何给定的数字在输入中只出现一次。