我正在尝试为一个函数编写一个代码来获取一个数组(让我们称之为arr1),其值介于32和64之间,以及数组的大小(比方说大小为n)。该函数将在O(n)中对数组进行排序。
我想这样做的方法是声明一个大小为32的第二个数组(让我们称之为arr2)并执行以下操作: 对于0和n之间的每个索引i,我们在arr2中将1放在[arr1 [i] -32]中。所以例如,如果对于当前的i,arr1 [i] = 40,那么我们将arr2中的1放在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) 感谢。
答案 0 :(得分:2)
问题在于:
int* arr2[32];
此行应为
int arr2[32];
因为arr2
包含计数器,而不是指针。这就是为1
分配arr2
失败的原因。
现在让我们讨论一下您的算法:对于具有重复值的数组,您尝试实施counting sort会中断,因为无论您找到项目的次数多少,都会将arr2[arr1[i]-32]
设置为1
。您应该将其更改为arr2[arr1[i]-32]++
,并使用计数将那么多计数值放入结果数组中。请参阅维基百科文章中的伪代码一个正确的实现。
这是a table comparing performances of various sorting algorithms。查找第二个表,其中包含非比较排序的详细信息。
答案 1 :(得分:0)
int *arr2[32];
应该是
int arr2[32];
前者声明了一个包含32个指针的数组。