为什么这个算法稳定,怎么能让它不稳定?

时间:2016-06-12 19:56:30

标签: arrays algorithm sorting

我因为感兴趣而需要知道如何知道算法是否稳定。

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

如果我正确理解算法,则不能将相同的数组元素分配给同一个数组,因此它是一个稳定的算法。

我怎么能让这个不稳定?我不想做出很好的改变,将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
}

1 个答案:

答案 0 :(得分:1)

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