我正在寻找有关在第3周CS50课程中实施计数排序功能的帮助。
必须对int数组进行排序。 我测试了各种未排序的数组,我的计数排序函数似乎正确地对数组进行排序,但是我的搜索函数在之后的排序数组上不起作用。 有人能给我一个暗示吗?
void countsort( int array[], int size) {
int count=0;
int zahl=0;
int max=65536;
int countarr [max];
int finalarr [size];
memset (countarr, 0, sizeof(countarr));
for(int i=0;i<size;i++) {
zahl=array[i];
countarr[zahl]++;
}
for(int i=0;i<max;i++) {
while(countarr[i]>0) {
finalarr[count]=i;
countarr[i]--;
count++;
}
}
array=finalarr;
for(int i=0;i<size;i++){
printf(" %i ",array[i]);
}
}
这是我在数组排序后使用的搜索算法,它适用于其他人的排序算法。
bool binarysearch(int value, int values[], int n){
int start=0,
end=n,
mid=0,
midpos=0;
while(end>0) {
midpos=(start+end)/2;
mid=values[midpos];
if(mid==value) return true;
if(mid<value) start=++midpos;
if(mid>value) end=--midpos;
}
return false;
}
答案 0 :(得分:0)
在binarysearch
中,循环条件while(end>0)
错误。
如果我们搜索的值大于数组中的至少一个元素,end
将永远不会为零。
尝试将其更改为while(end>=start)
,这实际上意味着所考虑的间隔非空。
在countsort
中,行array=finalarr;
不会复制整个数组。
相反, local 变量array
成为finalarr
的指针。
原始数组的内容保持不变,退出函数时排序的数组将消失。
这解释了为什么您的二进制搜索与其他排序函数(更好)一起工作
尝试将finalarr[count]=i;
更改为array[count]=i;
并完全删除finalarr
,立即将值放入array
。
或者,您可以使用memmove
代替该行。