2

我正在尝试为一个函数编写一个代码,该函数获取一个值在 32 到 64 之间的数组(我们称之为 arr1),以及数组的大小(比如说大小 n)。该函数将以 O(n) 对数组进行排序。

我想这样做的方法是声明一个大小为 32 的第二个数组(我们称之为 arr2)并执行此操作:对于 0 和 n 之间的每个索引 i,我们将 1 放入 arr2 的点 [arr1[i]- 32]。因此,例如,如果对于当前 i,arr1[i]=40,那么我们将 1 放入 arr2 的 40-32、8 点。然后我们遍历 arr2,如果 arr2[i]==1 然后放入arr[j] 我输入 i+32, j++。理论上,现在应该对 arr1 进行排序。

我的问题是代码,当我将值分配给 arr2 时,我在“=”下​​方有一条小红线,当我将鼠标悬停在它上面时,它说“不能将 int 类型的值分配给 int* 类型”

void sort_array(int* arr1,int n)
{
    int i=0,j=0;
    int* arr2[32];
    for(i=0;i<32;i++)
        arr2[i]=0;
    for(i=0;i<n;i++)
        arr2[arr1[i]-32]=1;
    for(i=0;i<32;i++)
        if(arr2[i]==1)
        {
            arr1[j]=i+32;
            j++;
        }
}

我还想听听是否有人对如何在 O(n) 中对该数组进行排序有更好的建议。quicksort 和 mergesort 是 nlog(n) 谢谢。

4

2 回答 2

2

这是问题所在:

int* arr2[32];

这条线应该是

int arr2[32];

因为arr2包含计数器,而不是指针。这就是为什么分配失败1的元素。arr2

现在让我们讨论您的算法:您尝试的计数排序实现将中断具有重复值的数组,因为无论您找到多少次,您都设置arr2[arr1[i]-32]为。1您应该将其更改为arr2[arr1[i]-32]++,并使用 count 将那么多计数值放入结果数组中。请参阅维基百科文章中的伪代码正确实现。

这是一个比较各种排序算法性能的表格。查找第二个表,其中包含非比较排序的详细信息。

于 2013-02-04T10:54:30.117 回答
0
int *arr2[32];

应该

int arr2[32];

前者声明了一个由 32 个指针组成的数组。

于 2013-02-04T10:54:50.303 回答