对于学习算法或者做一些查找题的同学来说刚开始都喜欢从头开始做遍历,这种算法的时间复杂度为O(N),这是一个普适性的算法,几乎所有的查找都可以用它,而且时间复杂度不高在我们能够接受的范围之内。但我下面介绍的是另外一个特殊的算法,它不具备普适性,它只适合查找那些已经排好序的元素并且查找的数据元素量很庞大,这种情况下用二分查找将在时间效率方面体现巨大优势,因为它的时间复杂度为O(logN),而且很多学校程序语言期末考试大题都会考到,所以建议还是及早的牢固掌握它。
代码:
1 # include<stdio.h>
2
3 #define MAX_N 100
4
5
6 int binary_search(int *arr,int n,int x){
7 int head= 0,tail= n-1,mid;//head,tail,和mid分别指向要查找数组的第一个,最后一个和中间元素
8 while(head <= tail){
9 mid=(head + tail)>> 1;//此时mid指向待查找数组的中间元素
10 if(arr[mid]== x) return mid;//如果arr[mid]== x 返回数组下标
11 if(arr[mid]< x) head= mid + 1;//如果arr[mid]< x将head替换成 mid后面+ 1的那个元素
12 else tail = mid - 1;//如果arr[mid]> x将head替换成mid前面-1的那个元素
13 }
14 return -1;
15 }
16 int main(){
17 int arr[MAX_N + 5],n,x;
18 scanf("%d",&n);//刚开始读入要输入元素的个数
19 for(int i = 0;i < n; i++){
20 scanf("%d",&arr[i]);//循环读入数组元素
21 }
22 while(~scanf("%d",&x)){
23 printf("%d\n",binary_search(arr,n,x));//查到返回下标值否则到返 回-1
24 }
25 return 0;
26 }