计算C中的排序显然有效但二进制搜索没有

时间:2017-06-17 18:52:43

标签: c algorithm sorting cs50 counting-sort

我正在寻找有关在第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;
} 

1 个答案:

答案 0 :(得分:0)

  1. binarysearch中,循环条件while(end>0)错误。 如果我们搜索的值大于数组中的至少一个元素,end将永远不会为零。 尝试将其更改为while(end>=start),这实际上意味着所考虑的间隔非空。

  2. countsort中,行array=finalarr;不会复制整个数组。 相反, local 变量array成为finalarr的指针。 原始数组的内容保持不变,退出函数时排序的数组将消失。 这解释了为什么您的二进制搜索与其他排序函数(更好)一起工作 尝试将finalarr[count]=i;更改为array[count]=i;并完全删除finalarr,立即将值放入array。 或者,您可以使用memmove代替该行。