算法第二章上机实践报告
1.实践题目:7-2 改写二分搜索算法
2.问题描述:设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
3.算法描述:
#include<iostream> using namespace std; int Seek(int a[], int b, int n) { int left = 0; int right = n - 1; int i = 0; int j = 0; while (left <= right) { int middle = (left + right) / 2; if (b == a[middle]){ i = j = middle; cout << i <<" "<<j; return middle; } if (b > a[middle]){ left = middle + 1; } else{ right = middle - 1; } } i = right; j = left; cout << i<<" "<< j<<endl; return -1; } int main() { int n; int x; cin >> n>> x; int *a = new int [n]; for (int i = 0; i < n; i++) { cin >> a[i]; } Seek(a, x, n); }
4.算法时间及空间复杂度分析:二分法通过执行while循环,不断地将问题的规模减小一半,所以为O(logn),空间复杂度为o(1)
5.心得体会:因为题型上其实跟第一题差不多,所以也没有多大问题,直接粘贴复制了一部分,并根据其要求进行了一些修改。

浙公网安备 33010602011771号