【问题标题】:C++ Linear search algorithmC++ 线性搜索算法
【发布时间】:2015-06-10 00:41:24
【问题描述】:

我正在尝试在 c++ 上创建线性搜索算法,但我的代码中的 linearSearch 函数遇到了一些问题。这是一个简单的 for 循环,我看不出问题出在哪里,我要求用户输入一个键,如果它是数组中的一个键,那么它应该给出正确的位置,但它没有。任何人都可以看到我在实施中出了什么问题吗?

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int linearSearch(int arr[],int size, int key){
for(int i = 0; i < size; ++i){
    if(key == arr[i]){
        return i;
    }else{
        return -1;
    }
  }
}


int main() {
 const int size = 20;
 int numbers[size];
 srand((unsigned) time(0));
 for(int i = 0; i < size; ++i){
    numbers[i] = (rand() % 100) + 1;
    cout << numbers[i] << " ";
 }
 cout << endl;
 int key;
 cout << "Enter a key to search for: " << endl;
 cin >> key;
 int retValue = linearSearch(numbers,size,key);
 if(retValue >= 0){
     cout << "Key found at position " << retValue << endl;
 }else{
     cout << "Key not found" << endl;
 }

return 0;
}

【问题讨论】:

  • 只是 FWIW,std::find 已经提供了线性搜索。

标签: c++


【解决方案1】:

问题出在这里:

if(key == arr[i]){
     return i;
 }else{
     return -1;
 }

在第一次比较后返回 i 或 -1,因此从不搜索数组的其余部分。您应该只在函数末尾删除else return -1 子句和return -1

如果您这样做,linearSearch 函数应如下所示:

int linearSearch(int arr[],int size, int key){
    for(int i = 0; i < size; ++i){
        if(key == arr[i]){
           return i;
        }
    }
    return -1;
}

【讨论】:

  • 此外,他甚至可能不会使用存在的值调用linearSearch()。他在 [0,100] 上生成了 20 个随机数,但代码没有检查数组。
  • @TimBiegeleisen:数组在填充时打印。
  • 我的立场是正确的。我是 Java 人,所以要有耐心。
  • 我不太明白你的回答,你能解释一下吗?
  • @Wolfgang-1 在调试器或纸上逐步执行 linearSearch() 函数,您会看到会发生什么。特别是你会看到 for 循环永远不会循环,因为无论 if 语句做什么,你总是在循环的第一次迭代期间从函数返回。
【解决方案2】:

您的 linearSearch 函数的问题在于,如果不匹配,它会在第一次比较之后返回 -1(未找到)。它不会搜索整个数组。

试试下面的代码,它向后搜索并在发现巧合或通过数组的“底部”时停止(i 等于 -1)。它返回 i 的当前值,如果遇到重合,则可以将其放入数组中,如果在搜索过程中没有发生任何事情,则返回 -1。

int linearSearch(int arr[], int size, int key){
    int i;
    for(i = size-1; i >= 0 && key != arr[i]; --i);
    return i;
}

【讨论】:

    【解决方案3】:
    int linearSearch(int array[], int n,int searchKey){
    
        for(int i=0; i<n;i++){
            if(searchKey==array[i]){
            return i;
            }
        }
        return -1;
    
    }
    

    【讨论】:

    • 您应该正确格式化您的代码。另外,请写下如何解决问题。
    【解决方案4】:
    int linearSearch(int arr[], int size, int key) {
        for (int i = 0; i < size; i++) {
            if (arr[i]==key) {
                return i;
            }
        }
        return -1;
    }
    

    问题是您要么返回i-1,否则什么也没有。返回这两个后代码将退出。而且我还认为retValue 也可以用1 递增以获得正确的位置。

    【讨论】:

      猜你喜欢
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多