【问题标题】:Binary Search algorithm c++二分搜索算法c ++
【发布时间】:2017-07-02 01:22:42
【问题描述】:

我正在尝试编写一个函数,该函数采用整数数组并在数组的第一个和最后一个之间搜索给定值的部分。如果值在数组中,则返回该位置。如果不是,我想返回-1。

这是我的函数的代码。

    int binarySearch(int *array, int min, int max, int value) {
    int guess = 0;
    bool found = false;
    while (!found) {
        guess = ((array[min] + array[max]) / 2);
        if (array[guess] == value) {
            found = true;
            return guess;
        }
        else if (array[guess] < value) {
            min = guess + 1;
        }
        else if (array[guess] > value) {
            max = guess - 1;
        }
    }
    return -1;
}

当您要搜索的值不在数组中时,我不确定如何跳出 while 循环?这是我为实现二进制搜索功能而遵循的伪代码:

  1. 令 min = 0 和 max = n-1(数组大小 -1)。将猜测计算为最大值和的平均值 min,向下取整(使其为整数)。
  2. 如果数组[猜测]等于 目标,然后停止。你找到了!返回猜测。
  3. 如果猜对了 低,即array[guess]
  4. 否则,猜测太高了。设置最大值 = 猜测 - 1。
  5. 返回步骤 2。

【问题讨论】:

  • 递归算法通常不需要while循环。

标签: c++ function binary-search


【解决方案1】:

我认为改变函数返回的内容是有意义的。如果找到该项目,它应该返回一个有效的索引而不是返回guess,否则返回-1。

另外,您使用guess 作为值和索引。那肯定会出问题。

guess 是下面的值。

    guess = ((array[min] + array[max]) / 2);

guess 是下面的索引。

    else if (array[guess] < value) {

这是我的建议:

// Return the index if found, -1 otherwise.
int binarySearch(int *array, int first, int last, int value)
{
   // Terminating condition 1.
   // If first crosses last, the item was not found.
   // Return -1.
   if ( first > last )
   {
      return -1;
   }

   int mid = (first + last)*0.5;

   // Terminating condition 2.
   // The item was found. Return the index.
   if ( array[mid] == value )
   {
      return mid;
   }

   // Recurse
   if (array[mid] < value)
   {
      return binarySearch(array, mid+1, last, value);
   }
   else
   {
      return binarySearch(array, first, mid-1, value);
   }
}

【讨论】:

    【解决方案2】:

    如果使用while循环则不需要递归,只要记住每次都计算guess,并将guess设置在索引的中间,而不是它们的值:

    int binarySearch (int *array, int first, int last, int value)
    {
    
        int guess = 0;
    
        while (first != last || array[guess] == value) {
            guess = (first + last) / 2;
    
            if (array[guess] == value)
                return guess;
            else if (array[guess] < value)
                last = guess + 1;
            else if (array[guess] > value)
                first = guess - 1;
        }
    
        return -1;
    }
    

    我也建议

    int first = 0, last = sizeof(array) / sizeof(array[0]) - 1;
    

    而不是将它们作为参数传递。

    【讨论】:

    • 我无意中复制并粘贴了我的旧方法。我最近的方法现在在更新的帖子中
    • @Liam 这个答案仍然有效;另外,您没有复制整个新功能
    • 谢谢,last = sizeof(array) / sizeof(array[0]) - 1 在做什么?
    • 当数组作为参数传递给函数时,此代码 (last = sizeof(array) / sizeof(array[0]) - 1;) 不起作用,并且此 last 将始终为 0
    • @UrielEli 如前所述,当数组作为函数参数传递时,sizeof(array) 将不起作用。通常 C++ 风格是传递一个指向范围前端的指针和一个超过范围末端的指针
    猜你喜欢
    • 2021-03-23
    • 2017-01-06
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2011-05-30
    相关资源
    最近更新 更多