我目前正在尝试通过递归实现二进制搜索,并为User Input创建了一个提示。每当我输入一个数字并搜索它时,我总会得到一个分段错误(核心转储)。我在CS50设备中编写了此代码。
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
int findMidpoint(int min, int max);
int binarySearch(int key, int array[], int min, int max);
int main(int argc, string argv[])
{
int array[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
printf("Please search for a number : ");
int key = GetInt();
int search = binarySearch(key, &array, array[0], array[22]);
printf("Result: %i \n", search);
}
int findMidpoint(int min, int max)
{
int sum = min + max;
int mid = sum/2;
return mid;
}
int binarySearch(int key, int array[], int min, int max)
{
if(min > max)
{
return -1;
}
else
{
int midpoint = findMidpoint(min, max);
if(array[midpoint] < key)
{
binarySearch(key, array, midpoint+1, max);
}
else if(array[midpoint] > key)
{
binarySearch(key, array, midpoint-1, max);
}
else
{
return midpoint;
}
}
return -1;
}
答案 0 :(得分:2)
以下是经过一些修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
int findMidpoint(int min, int max);
int binarySearch(int key, int array[], int min, int max);
int main(int argc, char** argv) {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23 };
printf("Please search for a number : ");
int key = GetInt();
int search = binarySearch(key, array, 0, 22);
printf("Result: %i \n", search);
}
int findMidpoint(int min, int max) {
int sum = min + max;
int mid = sum / 2;
return mid;
}
int binarySearch(int key, int array[], int min, int max) {
int midpoint = findMidpoint(min, max);
if (array[midpoint] < key) {
return binarySearch(key, array, midpoint + 1, max);
} else if (array[midpoint] > key) {
return binarySearch(key, array, min, midpoint - 1);
} else {
return array[midpoint];
}
return -1;
}
请注意,每次递归调用时,您需要return
binarySearch
的结果。
答案 1 :(得分:1)
min
和max
值是第一个和最后一个元素的索引,而不是值。因此,您应该使用索引调用该函数:
search = binarySearch(key, array, 0, 22);
请注意&
之前没有&符array
:数组将被视为指向其第一个元素的指针。 (此处&array
不是正确的类型;您应该收到警告。)
当你递归时,你将阵列分成两半,如果中点不是你想要的值,那么你可以在左半边和右半边。右半部分是正确的:
binarySearch(key, array, midpoint+1, max);
但是对于左侧部分,mitpoint - 1
是更高的界限:
binarySearch(key, array, min, midpoint - 1);
编辑:其他答案显示,但我错过了:当然,您必须将递归调用的结果返回给binarySearch
。
答案 2 :(得分:1)
应用程序实际上在堆栈溢出时崩溃,因为算法尚未正确实现。
遵循维基百科上的算法描述:http://en.wikipedia.org/wiki/Binary_search_algorithm
添加了一些返回,修改了递归调用(GetInt被硬编码值替换):
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int findMidpoint(int min, int max);
int binarySearch(int key, int array[], int min, int max);
int main(int argc, char** argv)
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
printf("Please search for a number : ");
int key = 10;
int search = binarySearch(key, (int*)(&array), 0, 22);
printf("Result: %i \n", search);
getchar();
}
int findMidpoint(int min, int max)
{
int sum = min + max;
int mid = sum / 2;
return mid;
}
int binarySearch(int key, int array[], int min, int max)
{
if (min > max)
return -1;
else
{
int midpoint = findMidpoint(min, max);
if (array[midpoint] < key)
return binarySearch(key, array, midpoint + 1, max);
else if (array[midpoint] > key)
return binarySearch(key, array, min, midpoint - 1);
else
return midpoint;
}
return -1;
}