簡體   English   中英

C語言中的二元搜索算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM