[英]Implementation of Binary Search of a Sorted Array in C
我編寫了以下程序來實現已排序數組的二進制搜索:
int flag=0;
void binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(a[middle]==x)
{
printf("%d has been found at postion %d!\n", x, middle+1);
flag=1;
}
else
if(x > a[middle])
binarysearch(x, a, middle, n);
else
if(x < a[middle])
binarysearch(x, a, m, middle);
}
main()
{
int i, size, x;
int a[100];
printf("Enter the size of the list : ");
scanf("%d", &size);
printf("Enter the list items in ascending order : \n");
for (i=0; i<size; i++)
scanf("%d", &a[i]);
printf("Enter the element to be found : ");
scanf("%d", &x);
binarysearch(x, a, 0, size-1);
if(flag != 1)
printf("%d has not been found in the list!", x);
}
這個程序的問題是,如果嘗試搜索不在列表中的項目,函數binarysearch
遞歸調用自身。 因此, flag
變量變得完全沒有意義。
是否有可能程序能夠告訴用戶他是否正在嘗試執行此類搜索(不在陣列中的某些內容)?
我假設它不可能,因為它是二進制搜索算法的基本缺陷。 請賜教。
檢查開頭的m == n
。
if(m == n)
{
if(a[n] == x) { printf("found\n"); }
return;
}
如果沒有x
,你繼續使用middle == n
和middle == m
來稱呼自己。
您的函數應該使用返回值並返回在數組中找到它的索引
int binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(a[middle]==x)
{
printf("%d has been found at postion %d!\n", x, middle+1);
return middle;
}
else
if(x > a[middle])
return binarysearch(x, a, middle, n);
else
if(x < a[middle])
return binarysearch(x, a, m, middle);
//if it is not found in the whole array
return -1;
}
你需要一個簡單的案例來打破遞歸,即n == m
。 如果這是真的並且x != a[middle]
,那么這個元素不在數組中:
void binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(n == m && x != a[middle])
{
printf("%d is not in the array", x);
return;
}
//...
或者你的if else風格:
void binarysearch(int x, int a[], int m, int n)
{
int middle=(m+n)/2;
if(n == m && x != a[middle])
{
printf("%d is not in the array", x);
}
else
if(a[middle]==x)
//...
我認為你對遞歸缺乏一些基本的了解。 遞歸函數在到達其基本情況時應返回值。 如果你知道我的意思,你的代碼最終會導致“StackOverflow”:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.