改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
//二分查找 #includeusing namespace std; int search(vector a,int n,int m){ 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; } if(i==j) cout<<"数字的位置在:"< a; int number; cout<<"输入一个由小到大排序的数组:"< >number; a.push_back(number); //每输入一个数字将其添加到数组的最后 if(cin.get() == 'n') //输入回车 跳出循环 break; } int n = a.size(); int m; //sort(a.begin(),a.end(),greater ()); //由大到小排序 //sort(a.begin(),a.end()); //默认由小到大 cout<<"输入要查找的数字:"< >m; search(a,n,m); return 0; }



