正如问题所述,我想确认计数排序算法是否为原地排序算法。
维基百科将原地算法描述为:
在计算机科学中,一个原地算法(或拉丁文 in situ)是一种使用具有少量常量额外存储空间的数据结构来转换输入的算法。该输入通常在算法执行时被输出覆盖。如果算法不是原地算法,则有时称其为非原地算法或离线算法(或拉丁文 ex situ)。
稳定排序算法会保持键(即值)相等的记录之间的相对顺序。也就是说,如果有两个记录 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
那么,为什么这不是一种稳定且在原地排序的方法呢?
假设输入的关键数据由数字表示,卫星数据由字符表示,则对于以下数据:
arr[] = { 1a,1b,1c,2z,5c,6c,7e,8q } // keeping in mind only keys are sorted
这个算法不会按顺序遍历1a,然后是1b,再是1c,并以此顺序重写它们吗?而且同一个数组被覆盖了,所以我们只需要根据键的类型而不是数量来获得恒定的空间。谢谢。
countsort
的实现,即使只是伪代码,而不是只留下注释。 - Yakk - Adam Nevraumont