算法第二章上机作业体会
一、实践题目———二分查找
二、问题描述
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入格式:
输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。
输出格式:
输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入样例:
4
1 2 3 4
1
输出样例:
0
2
三、算法描述
主要是运用递推的方法,不断的折半查找x,如果查找不到x,devide_selsct将会返回-1;而查找次数,则交给全局变量i。
#include<iostream>
using namespace std;
int i = 0;
int devide_select(int a[], int x, int left, int right){
if( left <= right){
i++;
int mid = (left + right) / 2 ;
if( a[mid] == x ) return mid;
if( a[mid] > x ) return devide_select( a, x, left, mid - 1);
if( a[mid] < x ) return devide_select( a, x, mid + 1, right);
}
else return -1;
}
int main(){
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++)
cin >> a[i];
int x;
cin >> x;
int x_sign = devide_select( a, x, 0, n-1);
cout << x_sign << endl;
cout << i;
}
四、算法时间及空间复杂度
1、时间复杂度
由于是递归的二分搜索算法所以,devide_selsct的时间复杂度为O(log n),而循环输入的时间复杂度为O(n),再加上其他语句的时间复杂度O(1),则可得算法的时间复杂度为,上面的相加,即O(n)
2、空间复杂度
这段代码里,向计算机请求的空间只有int和int[],他们的空间复杂度分别为O(1)和O(n),将他们相加即可得到算法的时间复杂度,即O(n)
五、心得体会
多写多练,方能提升自我。