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

标签 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
}

最佳答案

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

关于arrays - 为什么这个算法稳定,我怎么能让它不稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37778511/

相关文章:

python - 对给定列的 numpy 矩阵进行排序

c# - 对 ASP.NET 中进一步包含对象的对象列表进行排序

C指针/数组语法

arrays - 通用 Lisp : Why does lparallel have problems with assigning array elements?

python - 解析字典以具有一对一的键值映射

algorithm - 从随机位生成随机数

php - 使用 Twig 模板时,有没有办法从数组中获取平均值?

java - 将扩展ascii字符转换为java中的代码

javascript - 模糊字符串搜索但针对对象?

c - 合并排序的更好方法是什么?递归函数还是非递归函数?