正如问题所说,我想确认计数排序算法是否是就地排序算法。
维基百科将in-place algorithm描述为
在计算机科学中,就地算法(或原位拉丁语)是一种算法,它使用具有少量恒定额外存储空间的数据结构来转换输入。输出通常在算法执行时被输出覆盖。非就地算法有时称为非原位或非原位(或拉丁语非原位)。
稳定的排序算法使用相等的键(即值)保持记录的相对顺序。也就是说,排序算法是稳定的,如果只有两个记录R和S具有相同的密钥并且R出现在原始列表中的S之前,则R将出现在排序列表中的S之前。
以及计算排序页面的下方:
如上所述,计数排序不是就地算法;即使忽略计数数组,它也需要单独的输入和输出数组。
如果我们假设计数排序算法为:
countsort(){
for i = 0 .... n //where n is size of input array arr[]
countArr[ arr[i] ] += 1
//and then traverse countArr[] and rewrite arr[] with sorted values where value>0
那么为什么这不稳定并且到位排序呢?
让我们说输入key data
由numerals
和satellite data
按字符表示,然后是以下数据:
arr[] = { 1a,1b,1c,2z,5c,6c,7e,8q } // keeping in mind only keys are sorted
这个算法不会遍历1a然后1b然后1c并按照这个顺序重写它们吗?并且同样的数组也被覆盖了,所以我们只需要一个恒定的空间,这取决于键的类型而不是键的数量。
感谢。
答案 0 :(得分:3)
<强> 1。没有到位
您的countArr
未占用O(1)
内存,其大小必须为max(array_to_be_sorted) + 1
。由于您使用非常量额外内存,即使您覆盖原始数组,该算法也不会就位。
基本上,你打破了这部分定义:
在计算机科学中,就地算法(或原位拉丁语)是一种算法,它使用具有少量恒定额外存储空间的数据结构来转换输入。
因为您的数据结构不使用&#34;一小块恒定的额外存储空间&#34;。
<强> 2。稳定强>
与您描述的一样,它会保持原始顺序的值。
答案 1 :(得分:0)
正如问题所述,我想确认计数排序算法是否是就地排序算法。
计数排序是一种排序算法,可以以就地方式实现,也可以不就地方式实现。
Counting Sort维基页面当前有更多信息。对于实现的细节,American Flag Sort包含一些代码片段,它们基本上具有相同的想法。
如前所述,计数排序不是就地算法;即使不考虑count数组,它也需要单独的输入和输出数组。 可以修改算法,以便仅使用count数组作为辅助存储,就可以将项目按输入的顺序放在同一数组中。但是,修改后的就地计数排序版本并不稳定。[3]
下面的内容来自C的Robert Sedgewick算法的计数排序一章(6.10键索引计数),我发现它很有帮助。
如果要对大文件进行排序,则辅助阵列可能会出现内存分配问题。 我们可以就地完成排序(避免需要辅助数组),这种节省空间的代价是算法的稳定性, 从而限制了算法的实用性,因为涉及大量重复密钥的应用程序通常具有其他关联的密钥,应保留其相对顺序。