Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 计数排序是否到位&;稳定与否?_Arrays_Algorithm_Sorting - Fatal编程技术网

Arrays 计数排序是否到位&;稳定与否?

Arrays 计数排序是否到位&;稳定与否?,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,正如问题所说,我想确认计数排序算法是否是适当的排序算法 维基百科描述为 在计算机科学中,就地算法(或拉丁语原位算法)是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间。当算法执行时,输入通常被输出覆盖。不适当的算法有时被称为不适当或不适当(或在拉丁语中称为不适当) 稳定的排序算法保持具有相等键(即值)的记录的相对顺序。也就是说,如果每当有两条记录R和S具有相同的键,并且在原始列表中R出现在S之前,则排序算法是稳定的,在排序列表中R将出现在S之前 以及计数排序页面下方的某个位

正如问题所说,我想确认计数排序算法是否是适当的排序算法

维基百科描述为

在计算机科学中,就地算法(或拉丁语原位算法)是一种使用数据结构转换输入的算法,该数据结构具有较小、恒定的额外存储空间。当算法执行时,输入通常被输出覆盖。不适当的算法有时被称为不适当或不适当(或在拉丁语中称为不适当)

稳定的排序算法保持具有相等键(即值)的记录的相对顺序。也就是说,如果每当有两条记录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)空间复杂度
wiki页面当前有更多信息。对于实现的细节,有一些基本上共享相同想法的代码片段

如上所述,计数排序不是就地算法;即使不考虑计数数组,它也需要单独的输入和输出数组可以修改算法,使其将项目按排序顺序放置在作为输入的同一数组中,仅使用计数数组作为辅助存储;但是,修改后的就地计数排序版本不稳定[3]

下面是参考Robert Sedgewick在C语言中的算法的计数排序章节(6.10关键索引计数),我发现这非常有用

如果要对大型文件进行排序,辅助数组可能会出现内存分配问题。 我们可以就地完成排序(避免需要辅助数组),这种空间节省是以算法的稳定性为代价的, 因此限制了算法的实用性,因为涉及大量重复密钥的应用程序通常具有其他相关密钥,它们的相对顺序应该保持不变


就地算法意味着进程可以在同一对象上运行,而不需要辅助存储来进行计算,但它并不一定意味着就地排序是稳定的。然而,如果我没记错的话,计数排序是正确的stable@NikosM. 我非常关注同一个对象(这里是array arr[])。但是,对于每种类型的排序,我需要一些常量变量。您可能希望完成
countsort
的实现,即使是在伪代码中,而不是只留下注释。或者范围+1?我没有对一个大的数字数组应用计数排序。有不同的键,所以数据实际上应该是范围+1。假设数据只包含1-100个元素,这些元素可能会在1000个元素的数组中反复出现。还需要这么大的尺寸吗?虽然我意识到我与计数排序的经典实现有点偏离,但我仍然希望得到^.@hg_git的答案,这没关系。您可能有两个重复一百万次的键,或者有一百万个不重复一次的键。它仍然不是常数,它仍然取决于实际的输入。对不起,我把它们当作键,但我的意思是范围。计数排序通常在我们稍微了解数据时应用。这通常需要知道数据的范围。所以我不应该说,如果我知道我的数据的范围,那么它应该占据恒定的空间吗?假设数据中只有0和1,所以范围是2,因此我需要2个变量。@hg\u git它来自必须用于实现算法的堆栈(即使不使用递归,也必须手动为堆栈分配内存并使用它)