正在计算排序和安排稳定与否?

时间:2015-05-13 18:23:09

标签: arrays algorithm sorting

正如问题所说,我想确认计数排序算法是否是就地排序算法。

维基百科将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 datanumeralssatellite data按字符表示,然后是以下数据:

arr[] = { 1a,1b,1c,2z,5c,6c,7e,8q }  // keeping in mind only keys are sorted

这个算法不会遍历1a然后1b然后1c并按照这个顺序重写它们吗?并且同样的数组也被覆盖了,所以我们只需要一个恒定的空间,这取决于键的类型而不是键的数量。

感谢。

2 个答案:

答案 0 :(得分:3)

<强> 1。没有到位

您的countArr未占用O(1)内存,其大小必须为max(array_to_be_sorted) + 1。由于您使用非常量额外内存,即使您覆盖原始数组,该算法也不会就位。

基本上,你打破了这部分定义:

  

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

因为您的数据结构不使用&#34;一小块恒定的额外存储空间&#34;。

<强> 2。稳定

与您描述的一样,它会保持原始顺序的值。

答案 1 :(得分:0)

  

正如问题所述,我想确认计数排序算法是否是就地排序算法。

计数排序是一种排序算法,可以以就地方式实现,也可以不就地方式实现。

  • 不就地:稳定,O(N)个空间复杂度。
  • 就地
  • :不稳定,O(1)空间复杂度。

Counting Sort维基页面当前有更多信息。对于实现的细节,American Flag Sort包含一些代码片段,它们基本上具有相同的想法。

  

如前所述,计数排序不是就地算法;即使不考虑count数组,它也需要单独的输入和输出数组。 可以修改算法,以便仅使用count数组作为辅助存储,就可以将项目按输入的顺序放在同一数组中。但是,修改后的就地计数排序版本并不稳定。[3]

下面的内容来自C的Robert Sedgewick算法的计数排序一章(6.10键索引计数),我发现它很有帮助。

  

如果要对大文件进行排序,则辅助阵列可能会出现内存分配问题。   我们可以就地完成排序(避免需要辅助数组),这种节省空间的代价是算法的稳定性,   从而限制了算法的实用性,因为涉及大量重复密钥的应用程序通常具有其他关联的密钥,应保留其相对顺序。