我尝试对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);
^^^^^
}
是错的。