我尝试对CS50,pset3查找进行选择排序后实现二进制搜索。

我觉得我的逻辑是正确的,但是我不知道我的代码在哪里出错。下面是我的代码。

Error List

#include <cs50.h>

#include "helpers.h"

#define RANGE 65536

/**
 * Returns true if value is in array of n values, else false.
 */
bool search(int value, int values[], int n)
{
    // TODO: implement a searching algorithm
    //binary search
    int midpoint =  ((0 + (n-1))/2);

    while (n  > 0)
    {
        if (value == values[midpoint])
        {
        return true;
        }
        else if (value < values[midpoint]){
        midpoint = ((0 + (midpoint-1))/2);
        }
        else if  (value > values[midpoint]){
        midpoint = (((midpoint+1) + (n-1))/2);
        }
        if (value != values[midpoint])
        {
        return false;
        }
    }
   return false;
}

/**
 * Sorts array of n values.
 */
void sort(int values[], int n)
{
    // TODO: implement a sorting algorithm
    //selection sort
    for (int i = 0; i < n; i++)
    {
        int min = i;

        for (int j = i+1; j < n; j++)
        {
            if(values [j]< values[min])
            {
              min = j;
            }
            if(min != i)
            {
              int exchange = values [min];
              values [min] = values [i];
              values [i] = exchange;
            }
        }
    }
    return;
}


基本上,我认为我的逻辑基本上是正确的,但是我不太确定。我仍然是一个初学者,因此有时会陷入最简单的错误。
任何帮助将不胜感激。

最佳答案

功能错误。

例如,它可以无限执行。假设n等于1。在这种情况下,最初midpoint

int midpoint =  ((0 + (n-1))/2);


将设置为0。如果value小于values[0],则再次由于此if语句

    else if (value < values[midpoint]){
    midpoint = ((0 + (midpoint-1))/2);
    }


midpoint将被设置为0。函数的这一部分将一次又一次地重复。

也是在此if语句中midpoint的计算

    else if  (value > values[midpoint]){
    midpoint = (((midpoint+1) + (n-1))/2);
                                ^^^^^
    }


是错的。

09-28 11:45