二进制搜索和排序 - CS50查找pset3

时间:2017-11-26 10:46:05

标签: c binary-search cs50

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

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

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;
}

基本上,我认为我的逻辑大多是正确的,但同样,我不太确定。我还是个初学者,所以我有时会遇到最简单的错误。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

功能错误。

例如,它可以无限执行。我们假设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);
                                ^^^^^
    }

错了。