我在尝试对CS50进行选择排序后尝试实现二进制搜索,pset3 find。
我觉得我的逻辑是正确的,但我不知道我的代码错在哪里。以下是我的代码。
#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;
}
基本上,我认为我的逻辑大多是正确的,但同样,我不太确定。我还是个初学者,所以我有时会遇到最简单的错误。 任何帮助将不胜感激。
答案 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);
^^^^^
}
错了。