家庭作业:创建O(n)算法进行排序

use*_*934 1 arrays sorting algorithm

我正在参加edx的cs50课程并且正在做pset3的黑客版本(实质上它是高级版本).基本上,程序将一个值作为命令行参数进行搜索,然后要求在数组中使用一堆数字.然后它对该数组进行排序和搜索,以获取在命令行输入的值.程序的实现方式,它使用伪随机数生成器来提供数组的数字.

任务是编写搜索和排序功能.我已经有了搜索功能,但排序功能应该是O(n).在常规版本中,您应该使用O(n ^ 2)算法,这不是一个实现的问题.同样使用log n算法也不是问题.但问题集特别要求提供一个大的O(n)算法.

它提示说,因为数组中的数字不会为负数,并且不大于LIMIT(生成器输出的数字是模数,因此它们不大于65000).但是,这有助于将算法变为O(n)?

但计数排序算法,声称是一个可接受的解决方案,返回一个新的排序数组,而不是实际排序原始的数组,这与pset规范相矛盾,因为这个返回类型的void暗示,此函数不能返回排序数组; 它必须通过绕过其中的值来"破坏性地"对它所传递的实际数组进行排序.

此外,如果我们决定使用另一个循环将已排序的数组复制到原始数组上,并且有很多连续的循环,我不确定排序函数是否可以被认为具有O(n)的运行时间.这是实际的pset,问题是关于排序部分.

任何关于如何实现这种算法的想法都将非常感激.没有必要提供实际的代码,而只是你可以在提供的条件下创建O(n)算法的逻辑.

Ani*_*han 5

它提示说,因为数组中的数字不会是负数,并且不大于LIMIT(生成器输出的数字模数不高于65000).但是,这有助于使算法成为O(n).

这个暗示似乎直接指向计数排序.您可以创建65000个存储桶并使用它们来计算每个数字的出现次数.然后,您只需重新访问存储桶即可获得排序结果.

它利用了以下事实:

  1. 它们是整数.
  2. 它们的范围有限.

它的复杂性是O(n),因为这不是基于比较的排序,排序中的O(nlogn)下限不适用.这里有一个很好的可视化.