说明二分查找的基本思想,并用C/C++语言实现下面的二分查找(折半查找)函数。
bool BSearch(int * source,int n, int data) ; // 在source[n]中查找数据data
用代码怎么实现?求问
如果输入的数据是无序的,则需要先排序。代码如下:
#include <iostream>
using namespace std;
//数组以升序排列时,二分法查找x
bool BSearch( int* source, int n,int data)
{
int low, high, mid;
low = 0;
high = n-1;
while(low <= high)
{
mid = (low + high) / 2;
if(data < source[mid])
high = mid - 1;
else if(data > source[mid])
low = mid + 1;
else
{
cout << "找到,下标位置为:"<<mid<<endl;
return true;
}
}
return false;
}
//冒泡排序
void bubble_sort(int a[],int n)
{
int i,j,t;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if(a[j] > a[j+1]) //从小到大,升序
{
t = a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main()
{
int i,k;
bool ff=false;
int a[10];
cout << "请输入要查找的数:";
cin >> k;
cout << "请输入10个整数(升序):";
for(i=0;i<10;i++)
cin >> a[i];
//如果不是升序输入的数则需要先排序,如有是有序的,则不需要再排序
bubble_sort(a,10);
ff = BSearch(a,10,k);
if(!ff)
cout << "未找到此数";
return 0;
}
你题目的解答代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int BinarySearch(int a[], int n, int k)
{
if (n<=0)
return -1;
else if (k<a[0])
return -1;
else if (k>a[n-1])
return -1;
int left=0,right=n-1,middle;
while (left<=right)
{
middle=(left+right)/2;
if (a[middle]==k)
return middle;
else if (a[middle]<k)
left=middle+1;
else
right=middle-1;
}
return -1;
}
void sort(int a[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j] > a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
void main()
{
srand((unsigned)time(NULL));
int a[50], i, x, r;
for (i = 0; i < 50; i++)
a[i] = rand() % 201 + 100;
sort(a,50);
for (i = 0; i < 50; i++)
printf("%d ", a[i]);
printf("\n查找的数字:");
scanf("%d", &x);
r = BinarySearch(a,50,x);
if (r==-1)
printf("不存在\n");
else
printf("%d\n", r);
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
bool BSearch(int *source, int n, int data)
{
int left = 0, right = n - 1, mid;
while (left <= right)
{
if (source[left] == data)
return true;
if (source[right] == data)
return true;
mid = left + (right - left) / 2;
if (source[mid] == data)
return true;
if (source[mid] < data)
left = mid;
else
right = mid;
}
return false;
}