实践题目:7-2 改写二分搜索算法
问题描述:设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的值
代码:
#include <iostream> using namespace std; int bisearch(int* a, int x, int l, int r) { if(l > r) { cout<<r<<" "<<l; return 0; } else { int mid = (l+r) / 2; if (x == a[mid]) { cout<<mid<<" "<<mid; return 0; } if (x < a[mid]) bisearch(a, x, l, mid-1); else bisearch(a, x, mid+1, r); } } int main() { int a[1001]; int n, x; cin >> n; cin >> x; for(int i = 0; i < n; i++) cin >> a[i]; bisearch(a ,x, 0, n-1); return 0; }
算法描述:改写二分算法的输出部分,结合递归算法,输出中位数。
算法时间及空间复杂度分析:
①比较,赋值:4,O(1)
②递归:T(n/2)
T(n) = 4 + T(n/2)
= 4 + 4 + T(n/4)
= ...
=O(log2n)
心得体会:
1.这次实践题目是根据二分查找进行改编,解决不同问题,让人感受到算法的强大魅力。
2.这次将循环结构while与递归比较if...else...搞混,程序的开销增多。结队打代码能发现自己所打代码出现的问题,也能学到很多自己所不知道的知识。