目录

二分搜索算法实验

二分搜索算法实验

二分搜索算法

设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);
}