算法第二章上机实践报告
1.实践题目
改写二分搜索算法
2.问题描述
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
3.算法描述
在二分搜索算法的基础上进行小部分的修改。题目要求我们将一个数字插入到数组中,若数组中存在这个数字,则在进行判断后不需要对数组做修改;若不在其中,则根据其数字大小判断出可插入的相应位置。在二分搜索中,是给已经排好序的n个元素a[0;n-1]中找出特定元素,取大致的2/n个数字作比较,进行查找。此代码在设置好left、right两个指针后,当left<=right时进行二分查找,数字在数组中,对其位置进行判断;当left>right时,则跳过while循环,此时如果数字在数组中,则找出其left、right数组下标并把数字插入到正确位置,若数字不在数组中,则对left或right任一指针进行比较(此代码中是right指针),进行判断后找出数字位置。
详细代码:
#include<iostream> using namespace std; int BIN(int a[], int key, int n) { int left = 0; int right = n - 1; int i = 0; int j = 0; while (left <= right) { int middle = (left + right) / 2; if (key == a[middle]) { i = j = middle; cout << i <<" "<<j<<endl; return middle; } if (key > 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]; } BIN(a, x, n); }
4.算法时间及空间复杂度分析
时间复杂度:每执行一次while循环,待搜索的数组的大小减小为原先的1/2,所以对于含有n个数字的数组来说,n=2的k次方,即k=log n,T(n)=T(n/2)+O(1)=T(n/4)+
O(1)+O(1)=O(log n)
空间复杂度:采用非递归方法的二分搜索法,仅仅用几个单变量就够了,空间复杂度为O(1)
5.心得体会
在有了第一题二分搜索算法的基础上,我们对此算法的应用更加了解了,所以第二题整体思路就比较清晰。由于我的动手能力较差,所以在同伴打代码的时候就在认真观看、学习,接下来的时间需要付出加倍的时间提高自己的动手实践能力。