【问题标题】:Why is this algorithm stable and how could I make it unstable?为什么这个算法稳定,我怎么能让它不稳定?
【发布时间】:2016-06-12 19:56:29
【问题描述】:

我问是因为感兴趣,需要以某种方式了解如何知道算法是否稳定。

什么是稳定? 如果两个具有相同键的对象在排序输出中出现的顺序与它们在要排序的输入数组中出现的顺序相同,则称该排序算法是稳定的。

如果我对算法的理解正确的话,数组的相等元素不能分配给同一个数组,所以它是一个稳定的算法。

我怎么能让这个不稳定?不想大改,把for i = n down to 1 do改成for i = 1 to n do怎么样? 我认为这应该是打破它的一种方法,但我不太确定:D

Input: Array arr with n integers, from 1 to m
Output: Array arr sorted upwards

Initialize Array B with length m which is set to 0 everywhere
n <-- |arr|
Initialize Array C with length n
for i = 1 to n do
   B[arr[i] <-- B[arr[i]] + 1
end for
for j = 2 to m do
   B[j] <-- B[j] + B[j-1]
end for
for i = n down to 1 do
   C[B[arr[i]]] <-- arr[i]
   B[arr[i]] <-- B[arr[i]] - 1
end for
return C

这应该和上面的代码一样:

countingsort(A, k)
{
  C = array(0, k)
  for (m=0; m<=k; m=m+1)
    C[m] = 0
  // end for
  for (j=1; j<=A.size; j=j+1)
    C[A[j]] = C[A[j]] + 1
  // end for
  i=0
  B = array(1, A.size)
  for (m=0; m<=k; m=m+1)
    while ( C[m]>0 )
    { 
      B[i] = m
      i = i+1
      C[m]=C[m]-1
    } // end while
  // end for
  return B
}

【问题讨论】:

  • 你好,你没有排序……所以没必要说稳定与否……
  • 现有的编程语言比这种假设的语言更清楚地显示算法。只是说......我实际上想说的是:为什么让我们猜测这个“代码”实际上做了什么,而不是给出你想到的排序算法的名称?或者给我们一些我们可以执行的代码,看看它是否在排序?
  • 我自己也不知道这是怎么称呼的,但我们称之为“线性排序”,可能是因为它是按线性时间排序的……?我认为这个算法的一个更通用的名称是计数排序。
  • 有关稳定性含义的解释,请参阅stackoverflow.com/a/8312128/56778

标签: arrays algorithm sorting


【解决方案1】:

这是一个计数/基数排序,具有单个字段,将数组从 n 排序为 1。将最后一个 for 循环切换为 1 到 n 会使其不稳定,因为相等的元素将以相反的顺序存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多