实践题目:
设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
输入格式:
输入有两行:
第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。
输出格式:
输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值
问题描述:
这道题除了用二分搜索找出数组中的数输出其下标,还需要考虑当x不在数组中的情况,输出其相邻的下标。
算法描述:采用二分搜索算法。检索x是否在数组中,使用递归调用,若目标数大于中位数递归右半部分,小于中位数则递归左半部分。接着判断x是否在数组中,若在,则输出两次其坐标,不在则输出其相邻的下标。
#include<iostream>
using namespace std;
int t = 0;
int binarySearch(int a[],int x,int low,int high) {
if(low > high) {
return low;
}
t++;
int mid = (low + high)/2;
if(a[mid] == x) {
return mid;
};
if(a[mid] > x) {
return binarySearch(a, x, low, mid-1);
}
else{
return binarySearch(a, x, mid+1, high);
}
}
int main() {
int n;
int a[1000];
int x;
int index;
int left = 0;
cin >> n >> x;
for(int i = 0; i < n; i++) {
cin >> a[i];
};
index = binarySearch(a, x, 0, n-1);
if(a[index] != x) {
cout << index-1 <<" "<< index <<endl;
}
else{
cout << index << " " << index << endl;
}
}
算法时间及空间复杂度分析:
在二分搜索算法中,不断递归直至找到为止。每次递归就是n/2。所以时间复杂度为O(logn)
空间复杂度为O(n)
心得体会:在做题前要有一个指导思想。首先要熟悉掌握书上的代码,通过其核心的思路解决不一样的问题。有时要精简自己的代码,不然会显得繁琐,可读性也会下降。全面思考一道题,需要考虑多种情况,善于运用判断语句。在小组合作的过程中,两个人的交流能够更有效率完成题目。思路的不同有时会促进思考,在讨论的过程中收获了知识,也看到自己的不足。