【问题标题】:Binary search last element search二分查找最后一个元素查找
【发布时间】:2022-01-21 11:32:57
【问题描述】:

我正在学习二进制搜索,当我搜索数组中的最后一个元素时,搜索在 while 循环中的一次迭代中完成

#include <stdio.h>

void binSearch(int arr[], int element, int size) {
    int low = 0, mid, high = size - 1, i = 0;
    while (low <= high) {
        mid = (low + high) / 2;
        if (arr[mid] == element) {
            printf("The element was found after : %d", i);
            // return mid;
        }
        if (arr[mid] < element) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
        i++;
    }
}

int main() {
    int arr[20] = { 10, 22, 28, 33, 78, 124, 410, 511, 512, 999 };
    int element = 999, size = sizeof(arr) / sizeof(int);
    binSearch(arr, element, size);
    return 0;
}

【问题讨论】:

  • 你有什么问题?
  • 打印出mainsize的值。是你预期的吗?
  • 我想检查循环执行了多少次,所以我添加了一个 int i 并不断增加它。

标签: c


【解决方案1】:

定义int arr[20] = { 10, 22, 28, 33, 78, 124, 410, 511, 512, 999 };定义了一个长度为20个元素的数组arr,其中只有10个被初始化。其余元素设置为0,这意味着数组排序。

当调用binSearch(arr, 999, 20); 时,循环中测试的第一个元素位于mid = 19 / 2,而arr[9] 确实是999 所以the element was found after : 0 迭代。

您计算数组长度的表达式是正确的,尽管int size = sizeof(arr) / sizeof(*arr) 会更可靠,因为它不依赖于arr 的元素类型。您应该让编译器通过将arr 定义为来确定实际长度:

int arr[] = { 10, 22, 28, 33, 78, 124, 410, 511, 512, 999 };

这是修改后的版本:

#include <stdio.h>

int binSearch(int arr[], int element, int size) {
    int low = 0, mid, high = size - 1, i = 0;
    while (low <= high) {
        mid = low + (high - low) / 2;
        if (arr[mid] == element) {
            printf("The element was found after : %d\n", i);
            return mid;
        }
        if (arr[mid] < element) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
        i++;
    }
    return -1;
}

int main() {
    int arr[] = { 10, 22, 28, 33, 78, 124, 410, 511, 512, 999 };
    int element = 999, size = sizeof(arr) / sizeof(*arr);
    binSearch(arr, element, size);
    return 0;
}

【讨论】:

    【解决方案2】:

    您的代码中有错误。你只传递了 10 个元素,但说你会传递 20 个元素。 sizeof() 在这种情况下是 20,而不是 10。

    所以检查的第一个元素是第十个,这恰好是您搜索的那个 (999)。

    尝试:

    int arr[] = {...}; // The number of elements is auto-calculated
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多