1.实践题目

二分查找

2.问题描述

输入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

3.算法描述

定义两个变量left和right记录每次查找区间的最左和最右两个数的下标

判断每次查找区间的中间数与需要查找的数的大小,中间数比查找数大时用right记录中间数的下标,left不变。中间数比查找数小时用left记录中间数的下标,right不变。在left和tight之间再次查找。直到中间数等于要查找的数,查找结束,或者未查找到要查找的数。

代码

#include <iostream>
using namespace std;

int binarysearch(int *a, int n, int key, int &count){
     int left = 0;
     int right = n-1;

     while(left <= right){
     int mid = (left + right)/2;
     count++;
     if(key == a[mid]){
     return mid;
     }
     else if(key < a[mid]){
     right = mid - 1;
     }
     else
     {
     left = mid + 1;
     }

     }
    return -1;
     }

int main(){
int n , key;
int count = 0;
int *a = new int [1000];
cin>>n;
for(int i = 0; i < n; i++){
cin>>a[i];}
cin>>key;

int median = binarysearch(a, n, key, count);

cout<<median<<endl;
cout<<count;
return 0;
}

4.算法时间及空间复杂度分析

算法每执行一次while循环,需要搜索的数组大小减一半,在最坏情况下,while循环被执行了O(log n)次。而在循环体内执行需要O(1)时间,所以整个算法的时间复杂度为O(log n)

由于每一次查找都在同一个数组空间进行,所以空间复杂度为O(1)

5.心得体会

整个算法,关键是需要理解二分查找的查找原理。

同时,通过binarysearch函数引用变量count记录比较次数。

 
02-12 03:08