[英]Problems with binary search function
顶部列出的binary_search函数遇到问题。 不知道去哪里。 我对二进制搜索不是很熟悉。
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
void get_input(ifstream& fin, int a[], int size, int & array_size);
void binary_search (int a[], int & array_size)
{
cout << "Please enter the element you would like to search for \n";
int element;
cin >> element;
int lastindex=array_size-1, startindex=0;
while (startindex <= lastindex)
{
int midindex=(array_size/2);
if(element > a[midindex])
{
startindex=midindex;
}
else if (element < a[midindex])
{
lastindex=midindex-1;
}
}
}
int main()
{
int array_size=-1;
int a[100];
ifstream fin;
get_input (fin, a, 100, array_size);
binary_search (a, array_size);
return 0;
}
void get_input (ifstream& fin, int a[], int size, int & array_size)
{
fin.open("numbers.txt");
if (fin.fail())
{
cout << "File failed to open";
exit(1);
}
for(int i = 0; i < size; i++)
{
a[i] = 0;
}
cout << "The numbers in the array are: \n\n";
for (int i = 0; i < size; i++)
{
if (!fin.eof())
{
fin >> a[i];
array_size ++;
}
}
for (int i = 0; i < array_size; i++)
{
cout << a[i] << " ";
}
cout << "\n\n\n";
cout << "The numbers in the array sorted are: \n\n";
for(int i = 0; i < array_size; ++i )
{
int temp2 = a[i];
for (int j = i+1; j < array_size; ++j )
{
if( a[j] < temp2)
{
temp2 = a[j];
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (int i = 0; i < array_size; i++)
{
cout << a[i] << " ";
}
cout << "\n\n\n";
fin.close();
}
完成后,该程序假定从文件中获取输入,将其分配给数组,然后对该数组进行排序。 之后,我需要使用二进制搜索来找到用户给定的数字,并向用户显示其在数组中的位置。
更新:找到错误的索引输出...。我应该只添加一个到midindex吗?
void binary_search (int a[], int & array_size)
{
cout << "Please enter the element you would like to search for \n";
int element;
cin >> element;
int lastindex=array_size-1, startindex=0;
while (startindex <= lastindex)
{
int midindex= startindex + (lastindex - startindex) / 2;
if(element > a[midindex])
{
startindex=midindex+1;
}
else if (element < a[midindex])
{
lastindex=midindex-1;
}
else if (element == a[midindex])
{
cout<<"Element "<<element<<" found at index "<<midindex<<endl;
return;
}
}
}
尝试改变
startindex=midindex;
至:
startindex=midindex + 1;
和
int midindex=(array_size/2);
至
int midindex= startindex + (lastindex - startindex) / 2
最重要的是,找到元素后您什么也不做!
if(element == a[midindex]) {
cout<<"Element "<<element<<" found at index "<<midindex<<endl;
return;
}
我的第一反应是换线
int midindex=(array_size/2);
至
int midindex = startindex + (lastindex - startindex) / 2;
另外,您是否不希望报告是否找到了所需元素? 要检测找到元素的情况,可以使用另一个if
分支,如下所示
if( element == a[midindex] )
可以插入。 可以有一个return element;
或在其中return midindex
并return failure;
在循环之外。
编辑:我不经意地尝试编写二进制搜索的版本。 我不声称它是正确的,因为二进制搜索因不正确而闻名。 一些带有测试用例和输出的代码被上传到了键盘上。
片段:
int *
mybsearch( int const * const a, size_t const n, int const key ) {
int * lo = const_cast< int * >( a );
int * hi = lo + n;
while( lo <= hi ) {
int * const mid = lo + (hi - lo) / 2;
int const midelem = *mid;
if( key == midelem ) {
return mid;
}
else if( key < midelem ) {
hi = mid - 1;
}
else {
lo = mid + 1;
}
}
return NULL;
}
主要和测试代码:
int main() {
int const arr[] = {10, 20, 30, 40, 50, 60, 70, 80, 90};
size_t const num = sizeof( arr ) / sizeof( int );
int * pos20 = mybsearch( arr, num, 20 );
assert( pos20 && (*pos20 == 20) );
int * pos25 = mybsearch( arr, num, 25 );
assert( !pos25 );
int * pos5 = mybsearch( arr, num, 5 );
assert( !pos5 );
int * pos105 = mybsearch( arr, num, 105 );
assert( !pos105 );
}
二进制搜索可以很好地作为递归算法。 传入数组和长度,检查中间值,然后根据需要递归遍历数组的上/下半部分。
请仔细考虑int midindex=(array_size/2);
当array_size = 1时。然后泛化为array_size =3。然后到任何奇数。 这将需要在您的头部或纸上进行小批量模拟。
你近了 您想做这样的事情:
int binary_search ...
所以你可以返回元素的索引
while (startindex < lastindex)
{
int midindex=(startindex+endindex)/2;
if(element = a[midindex]) {
return midindex;
}
else if(element > a[midindex])
{
startindex=midindex+1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.