Arrays 计数排序是否到位&;稳定与否?
正如问题所说,我想确认计数排序算法是否是适当的排序算法 维基百科描述为 在计算机科学中,就地算法(或拉丁语原位算法)是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间。当算法执行时,输入通常被输出覆盖。不适当的算法有时被称为不适当或不适当(或在拉丁语中称为不适当) 稳定的排序算法保持具有相等键(即值)的记录的相对顺序。也就是说,如果每当有两条记录R和S具有相同的键,并且在原始列表中R出现在S之前,则排序算法是稳定的,在排序列表中R将出现在S之前 以及计数排序页面下方的某个位置: 如上所述,计数排序不是就地算法;即使不考虑计数数组,它也需要单独的输入和输出数组 如果我们假设计数排序算法为:Arrays 计数排序是否到位&;稳定与否?,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,正如问题所说,我想确认计数排序算法是否是适当的排序算法 维基百科描述为 在计算机科学中,就地算法(或拉丁语原位算法)是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间。当算法执行时,输入通常被输出覆盖。不适当的算法有时被称为不适当或不适当(或在拉丁语中称为不适当) 稳定的排序算法保持具有相等键(即值)的记录的相对顺序。也就是说,如果每当有两条记录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,然后按照这个顺序重写它们吗?同样的数组也被覆盖,所以我们只需要一个恒定的空间,这取决于键的类型,而不是键的数量
谢谢。1。不到位 您的
countArr
不占用O(1)
内存,它的大小需要max(数组要排序)+1
。由于使用的是非常量额外内存,因此即使覆盖原始数组,算法也不正确
基本上,你打破了这一部分的定义:
在计算机科学中,就地算法(或拉丁语原位算法)是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间
因为您的数据结构不使用“少量、恒定的额外存储空间”
2。稳定
正如您所描述的,它将保持值的原始顺序
正如问题所说,我想确认计数排序算法是否是就地排序算法
计数排序是一种排序算法,既可以就地实现,也可以不就地实现
- 不到位:稳定,O(N)空间复杂度
- 到位:不稳定,O(1)空间复杂度李>
就地算法意味着进程可以在同一对象上运行,而不需要辅助存储来进行计算,但它并不一定意味着就地排序是稳定的。然而,如果我没记错的话,计数排序是正确的stable@NikosM. 我非常关注同一个对象(这里是array arr[])。但是,对于每种类型的排序,我需要一些常量变量。您可能希望完成
countsort
的实现,即使是在伪代码中,而不是只留下注释。或者范围+1?我没有对一个大的数字数组应用计数排序。有不同的键,所以数据实际上应该是范围+1。假设数据只包含1-100个元素,这些元素可能会在1000个元素的数组中反复出现。还需要这么大的尺寸吗?虽然我意识到我与计数排序的经典实现有点偏离,但我仍然希望得到^.@hg_git的答案,这没关系。您可能有两个重复一百万次的键,或者有一百万个不重复一次的键。它仍然不是常数,它仍然取决于实际的输入。对不起,我把它们当作键,但我的意思是范围。计数排序通常在我们稍微了解数据时应用。这通常需要知道数据的范围。所以我不应该说,如果我知道我的数据的范围,那么它应该占据恒定的空间吗?假设数据中只有0和1,所以范围是2,因此我需要2个变量。@hg\u git它来自必须用于实现算法的堆栈(即使不使用递归,也必须手动为堆栈分配内存并使用它)