[英]Binary chop search algorithm in C
我正在嘗試用C語言編寫二進制印章搜索功能,並且遇到了一些問題。 首先,在找到中點值之后,該函數甚至沒有進入任何if循環。
函數是這樣的:
int binarychopsearch(int i, int *array, int min, int N) {
min = 0;
int max = N - 1;
printf("Min = %d, Max = %d\n", min, max);
printf("i = %d\n", i);
int mid = (min + max)/2;
//printf("midpoint = %d\n", mid);
printf("array[%d] = %d\n", mid, array[mid]);
if (i < array[mid]) {
printf("in this loop\n");
printf("i = %d, array[mid] = %d\n", i, array[mid]);
// key is in lower subset
return binarychopsearch(i, array, min, mid - 1);
}
else if (i > array[mid]) {
printf("in the greater than loop\n");
printf("i = %d, array[mid] = %d\n", i, array[mid]);
return binarychopsearch(i, array, mid + 1, max);
}
else
//if (i = array[mid]) {
return mid;
}
我不包括輸入值的主要來源,因為我認為問題出在此函數中。 它正在編譯並運行,但是沒有進入循環,因此找不到“ i”值的位置。 我很堅持這一點,因為我看不出問題出在哪里。
任何幫助都非常感謝!
謝謝
如果i
大於(或等於) array[mid]
那么您將無條件地從函數返回。 取而代之的是,您應該檢查下一個條件,然后如果該條件也是假的,那么您就知道已經找到了要查找的值。
所以它看起來應該像
if (i < array[mid])
{
...
}
else if (i > array[mid])
{
...
}
else
return mid;
您的代碼還有其他問題。
假設您有以下數組
int array[] = { 1, 2, 3, 4, 5 };
而您正在尋找值5
。
調用將如下所示:
| Call# | min | N | max | mid | array[mid] | | 1 | 0 | 5 | 4 | 2 | 3 | | 2 | 3 | 4 | 3 | 3 | 4 | | 3 | 4 | 3 | 2 | 2 | 3 | | 4 | 3 | 2 | 1 | 2 | 3 | | 5 | 3 | 1 | 0 | 1 | 2 | | 6 | 2 | 0 | -1 | 1 | 2 | . . .
很顯然,這不會很好地結束。 實際上,您很快就會以負索引結尾,這使您處於不確定行為的領域 。
對於兩種遞歸情況,建議您在嘗試修復算法時在紙上創建自己的表。
如果您不使用max
而是使用N
來調用遞歸函數,即
return binarychopsearch(i, array, mid + 1, N);
那么您將有以下電話
| Call# | min | N | max | mid | array[mid] | | 1 | 0 | 5 | 4 | 2 | 3 | | 2 | 3 | 5 | 4 | 3 | 4 | | 3 | 4 | 5 | 4 | 4 | 5 |
因此,第三個調用找到了該數字,並返回了索引4
。
您還應該更改第一個電話:
return binarychopsearch(i, array, min, mid);
問題是當i >= array[mid]
:您系統地返回-1: esle if
使用esle if
if(i < array[mid])
{}
else if(i > array[mid])
{}
else // i == array[mid]
{}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.