二分搜索算法实验
目录
二分搜索算法实验
二分搜索算法
设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。并对自己的程序进行复杂性分析。
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int search(int *a,int n,int m) //a[n]是搜索数组,m为要搜索的元素,n是数组的长度
{
int i = 0;
int j = 0;
int detection = -1; //标志位
int middle =0; //中间值的下标
int top = n-1; // 数组的右边界
int low = 0; //数组的左边界
while (low <= top)
{
middle = (low + top)/2; //先计算该数组中间值下标
if (a[middle] == m) //如果中间值等于要搜索的元素,则将标志位标记为中间值下标
detection=middle;
if (a[middle] < m) //如果中间值小于要搜索的元素,即要查询元素在中间值右边,则将要查询数据左边界改成中间值之后一个的数据
{
low=middle+1;
}
else //如果中间值大于要搜索的元素,即要查询元素在中间值左边,则将要查询数据左边界改成中间值之前一个的数据
{
top=middle-1;
}
}
if (detection == -1) //如果m没有在其中,则执行完,top为底,low为顶,m在中间。
{
i = top;
j = low;
}
else
{
i = detection;
j = i;
}
cout << "i的值为:" <<i<<endl<< "j的值为:"<<j<< endl;
return 0;
}
int main()
{
//n为数列长度,m为要找的整数
int n=0;
int m=0;
cout << "请输入数列的长度和要找的整数(中间用空格隔开)" << endl;
cin >> n >> m;
int *a;
a = new int[n];
cout << "请按照顺序依次输入数组的数据:" << endl;
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
search(a,n,m);
}