- 实践题目:7-1 二分查找
- 问题描述:输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
- 算法描述:
首先把有n个元素的排好序的数组a分成两半,每次把第n/2个与要搜索的数x进行比较,如果相等,则比较成功。如果a[n/2]<x,则继续搜索数组的左半部分,如果a[n/2]>x,则搜索数组的右半部分,重复循环记录次数直到比较成功。如果在数组中找不到x元素,则返回-1。
实现代码如下:
int BinarySearch(int a[],int x,int n)
{
int l=0,r=n-1;
while(l<=r)
{
int m=(l+r)/2;
if(x==a[m]) cout<<m<<endl;
if(x>a[m]) l=m+1;//继续在左半部分查找
else r= m-1;//继续在右半部分查找
p++;//p为比较次数
if(x!=a[m]&&l>r) cout<<-1<<endl;//找不到时返回-1
}
- 算法时间及空间复杂度分析(要有分析过程):
时间复杂度:每执行一次循环,数组长度减小一半,其中把数组分成一半的时间复杂度为O(1)
T(n) = O(1) + T(n/2)
T(n) = O(1) + logn
O(n) = logn
空间复杂度:O(1),辅助空间是常数级别的
- 心得体会(对本次实践收获及疑惑进行总结):
(1)在本次实践中,体会到了在编写代码时,不仅仅要考虑功能的实现,且要对算法进行时间复杂度的分析,谨慎使用循环语句。
(2)还体会到了对程序的实践过程要有清晰的理解,如在题目中要考虑对比较次数的统计,如何快速分析以便做到减少语句的执行次数且结果准确,就需要对各种情况的输入程序执行的语句有清楚的认识。