排序到位

时间:2013-05-16 10:52:30

标签: algorithm sorting

“排序到位”是什么意思?

5 个答案:

答案 0 :(得分:33)

就地算法的想法对于排序并不是唯一的,但排序可能是最重要的情况,或者至少是最知名的。这个想法是关于空间效率 - 使用最少量的RAM,硬盘或其他可以逃脱的存储。这可以追溯到几十年前,当硬件更加有限时。

这个想法是通过连续转换数据直到产生输出,在包含输入的同一存储空间中产生输出。这样就无需使用两倍的存储空间 - 一个区域用于输入,另一个区域用于输出。

排序是一个相当明显的情况,因为排序可以通过重复交换项目来完成 - 排序只重新排列项目。交换不是唯一的方法 - 例如,Insertion Sort使用稍微不同的方法,相当于进行一系列交换但速度更快。

另一个例子是matrix transposition - 再次,这可以通过交换项目来实现。添加两个非常大的数字也可以就地完成(结果替换其中一个输入)从最低有效数字开始并且向前传播。

回到排序,重新安排"到位的优势"当你想到punched cards的堆栈时会变得更加明显 - 它最好避免复制穿孔卡片来对它们进行排序。

一些排序算法允许这种就地操作,而其他算法则不允许。

但是,所有算法都需要一些额外的存储空间用于工作变量。如果目标只是通过连续修改输入来生成输出,那么通过保留大量内存来定义算法是相当容易的,使用它来生成一些辅助数据结构,然后使用它来指导那些修改。您仍然可以通过转换输入"来生成输出,但是您要击败练习的全部内容 - 您没有节省空间。

出于这个原因,就地定义的正常定义要求您达到一定的空间效率标准。使用与输入成比例的额外空间(即O(n)额外空间)绝对不能接受,并且仍在调用您的算法"就地"。

就地算法的Wikipedia page目前声称就地算法只能使用恒定量 - O(1) - 额外空间。

  

在计算机科学中,就地算法(或原位拉丁语)是一种算法,它使用具有少量恒定额外存储空间的数据结构来转换输入。

In Computational Complexity部分中指定了一些技术细节,但结论仍然是Quicksort需要O(log n)空格(true),因此不是就地(我相信这是假的)。

O(log n)小于O(n) - 例如,16,777,216的基数2日志是24。

Quicksort和heapsort通常都被认为是就地的,而且heapsort可以用O(1)额外的空间实现(我之前错了)。 Mergesort更难以就地实现,但是不合适的版本对缓存非常友好 - 我怀疑实际实现接受O(n)空间开销 - RAM很便宜但内存带宽是一个主要瓶颈,所以用于缓存效率和速度的交易记忆通常是一个很好的协议。

[编辑当我编写上述内容时,我假设我正在考虑对数组进行就地合并排序。链表的就地合并排序非常简单。关键的区别在于合并算法 - 两个链接列表的合并没有复制或重新分配很容易,对两个较大阵列的子阵列(没有O(n)辅助存储器)做同样的事情AFAIK isn&#39 ; T]

Quicksort即使是就地也具有缓存效率,但可以通过吸引其最坏情况行为而被取消作为就地算法的资格。存在退化情况(在非随机版本中,通常在输入已经排序时),其中运行时间是O(n ^ 2)而不是预期的O(n log n)。在这种情况下,额外的空间要求也增加到O(n)。但是,对于大型数据集和一些基本预防措施(主要是随机枢轴选择),这种最坏情况的行为变得非常不可能。

我个人认为O(log n)额外空间对于就地算法来说是可以接受的 - 它不会作弊,因为它不会破坏原来的原地工作点。

但是,我的观点当然只是我的观点。

一个额外的注意事项 - 有时人们会因为输入和输出都有一个参数而就地调用函数。它并不一定表示函数是空间有效的,结果是通过转换输入产生的,或者甚至参数仍然引用相同的存储区域。这种用法并不正确(或prescriptivists会声称),尽管它很常见,但最好不要注意它,但不要对此感到压力。

答案 1 :(得分:4)

我不认为这些术语密切相关:

按位排序表示通过直接在列表中修改元素顺序对现有列表进行排序。相反的是按原样保留原始列表并按顺序创建新列表

自然排序这个术语描述了如何以某种方式订购完整对象。例如,您可以说 0低于1 (整数的自然排序)或 A在B 之前按字母顺序排列(字符串的自然排序)。你很难说鲍勃比一般的更大或更低,因为它在很大程度上取决于具体的属性(按名称,年龄,收入按字母顺序排列......)。因此没有人的自然顺序

答案 2 :(得分:3)

就地排序意味着在没有任何额外空间要求的情况下进行排序。根据{{​​3}},它说

  

就地算法是一种算法,它使用具有少量恒定额外存储空间的数据结构来转换输入。

wiki是就地排序的一个示例。

答案 3 :(得分:0)

我不确定这些概念是否足够相似,可以按照建议进行比较。是的,它们都涉及排序,但其中一个是人类可理解的(自然的)排序顺序,另一个是通过覆盖现有结构而不是使用额外的数据结构(如泡泡排序)

答案 4 :(得分:0)

它可以通过使用交换函数来完成,而不是创建一个全新的结构,我们实现该算法甚至不知道它的名字:D