1.实践题目:
7-1 二分查找
2.问题描述:
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
3.算法描述:
#include<iostream>
using namespace std;
int BIN(int a[], int key, int n) {
int left = 0;
int right = n - 1;
int t = 0;
while (left <= right) {
int middle = (left + right) / 2;
t++;
if (key == a[middle])
{
cout << middle<<endl;
cout << t;
return middle;
}
if (key > a[middle])left = middle + 1;
else { right = middle - 1; }
}
cout << "-1"<< endl;
cout << t ;
return -1;
}
int main() {
int n;
cin >> n;
int *a = new int [n];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int x;
cin >> x;
BIN(a, x, n);
//也可以cout<<BIN(a,x,n);
system("pause");
}
4.算法时间及空间复杂度分析
因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为
n/(2^m)=1;
2^m=n;
所以时间复杂度为:log2(n)
整个算法请求了一个int和一个int [n] 的空间,空间复杂度分别是O(1) 和O(n),所以最终空间复杂度是O(n)
5.心得体会:
本次上机实践收获颇多,自己可能对于细节方面的问题把握不够好,对于时间和空间复杂度的计算也不是很好,以及对算法的运用尚不熟练,接下来还需要继续努力,查缺补漏。
浙公网安备 33010602011771号