Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制搜索逻辑_C++_C_Binary Search - Fatal编程技术网

C++ 二进制搜索逻辑

C++ 二进制搜索逻辑,c++,c,binary-search,C++,C,Binary Search,我在一本数据结构书中读到了二进制搜索的伪代码,然后开始编写代码。我写的代码是: #include <iostream.h> #include <conio.h> template <class T> int BSearch(T x[], const int n, T item) { int loc, first = 0, found = 0, last = n-1; while(first <= last &&a

我在一本数据结构书中读到了二进制搜索的伪代码,然后开始编写代码。我写的代码是:

#include <iostream.h>
#include <conio.h>
template <class T>

int BSearch(T x[], const int n, T item)
    {
    int loc, first = 0, found = 0, last = n-1;
        while(first <= last && !found)
        {
            loc = (first + last)/2;
            if(item < x[loc])
                last = loc - 1;
            else if(item > x[loc])
                first = loc + 1;
            else
                found = 1;
         }
      return found;
   }

int main()
    {
    const int n =5;
      int x[n],item;
      cout << "Pls enter " <<n<<" number(s): ";

      for(int i = 0; i < n;i++)
        cin >> x[i];
      cout << "Pls enter the item to Search: ";
        cin >> item;
      if(BSearch(x,n,item))
        cout << "\n\t Item Exist";
      else
        cout << "\n\t Item NOT Exist";

      getch();
      return 0;
   }
#包括
#包括
模板
内部B搜索(T x[],常量内部n,T项)
{
int loc,first=0,found=0,last=n-1;
while(第一个x[loc])
第一个=loc+1;
其他的
发现=1;
}
发现退货;
}
int main()
{
常数int n=5;
int x[n],项目;

cout二进制搜索仅适用于有序列表。但是您没有对从
std::cin
获得的列表进行排序,因此二进制搜索会得到错误的结果


要解决此问题,您必须将输入限制为预先排序的列表,或者在进行二进制搜索之前,您必须先对列表进行排序。

我尝试了您的代码,它似乎工作正常。您必须记住,您输入的数字必须从小到大进行排序。

二进制搜索涉及将搜索范围缩小到通过将范围划分为其原始大小的一半进行一半。二进制搜索对排序数组进行操作。它将此范围中间的元素与要搜索的值进行比较,如果该值小于中间值,则在从第一个元素到中间的范围内查找该值,否则新的搜索范围将变为从中间到最后一个元素此过程持续进行,直到找到所需元素或下限大于上限。二进制搜索的效率在平均和最坏情况下为O(log2n),在最佳情况下为O(1)。执行二进制搜索的“C”程序如下所示:

/* Binary Search */
#include <stdio.h>

#define MAX 10

int main(){
int arr[MAX],i,n,val;
int lb,ub,mid;
printf(“nEnter total numbers?”);
scanf(“%d”,&n);
for(i=0;i<n;i++){
printf(“nEnter number?”);
scanf(“%d”,&arr[i]);
}
printf(“nEnter the value to search?”);
scanf(“%d”,&val);
lb=0;ub=n-1;
while(lb<=ub){
mid=(lb+ub)/2;
if(val<arr[mid])
ub = mid-1;
else if(val>arr[mid])
lb = mid+1;
else {
printf(“nNumber found…!”);
return;
}
}
printf(“nNumber not found…!”);
}
/*二进制搜索*/
#包括
#定义最大值10
int main(){
int arr[MAX],i,n,val;
内部lb、ub、mid;
printf(“输入总数?”);
scanf(“%d”和“&n”);

例如(i=0;i当你用调试器调试代码时发生了什么?@irrelephant:在书中作者说"最后一点要注意的是,在排序和搜索的第6.2.1节中,Knuth记录了第一个二进制搜索例程是在1946年发布的,但是第一个没有bug的二进制搜索例程直到1962年才出现。要正确地进行二进制搜索是非常困难的!而且,让用户键入大量的值,只是为了只允许对它们进行一次搜索。你真的应该在“输入要搜索的项”代码周围添加一个循环,这样你就可以对单个数据集进行彻底的测试。@Jonathan Leffler:谢谢你能帮我写一个适用于无序列表的二进制代码吗?@JohnMartin-唯一适用于无序列表的二进制搜索算法是一个t在搜索之前先排序。@JohnMartin Karthik T说的是真的。因此,如果这是一个家庭作业,你应该再次阅读说明,如果你可以理所当然地将排序列表视为理所当然。我想知道是否可以,因为有效地对列表排序比二进制搜索要复杂得多。如果你确实需要它来执行某些程序,我建议你使用它标准库算法。特别是,可能会有所帮助。