基础算法之二分法查找

二分查找算法C

二分查找也属于顺序表查找范围,二分查找也称为折半查找。二分查找(有序)的时间复杂度为O(LogN)。

二分查找的基本思想是, 在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给 定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。

从二分查找的定义我们可以看出,使用二分查找有两个前提条件:

1,待查找的列表必须有序。

2,必须使用线性表的顺序存储结构来存储数据。

 

二分法查找在针对大量有序排列的情况下发挥出很优越的效率,这里以最具规律性的数组为例,代码如下:

 1 #include <stdio.h>
 2 //二分查找
 3 int binary_search(const int c[], int l,int h,int key);
 4 void Display(int x);
 5 int a[]={15,8,100,46,22,56,34,79,98,66,200,11,300};
 6 int z=sizeof(a)/sizeof(int);
 7 int b[sizeof(a)/sizeof(int)];
 8 int t;
 9 int i;
10 int main(int argc, const char * argv[]) {
11     
12     for (i=0; i<(sizeof(a)/sizeof(int)); i++) {
13         b[i]=a[i];
14     }
15     //printf("%ld\n",sizeof(a)/sizeof(int));
16     
17     for(i=0;i<(sizeof(a)/sizeof(int));i++)
18     {
19         for(int j=i;j<(sizeof(a)/sizeof(int));j++)
20         {
21             if(b[i]>b[j]) {
22                 t=b[i];
23                 b[i]=b[j];
24                 b[j]=t;
25             }
26         }
27     }
28     printf("\n");
29     int m=0;
30     int n=z;
31     int w;
32     int x;
33     printf("请输入要查找的整数:");
34     scanf("%d",&x);
35     w=x;
36    // getchar();
37     int g;
38     g=binary_search(b, m, n, w);
39     Display(g);
40     return 0;
41 }
42 
43 int binary_search(const int c[], int l,int h, int key){
44     while(l<= h)
45     {
46         int f = (l + h)/2;
47         if(c[f]== key)
48             return c[f] ;
49         //在左半边
50         else if(c[f] > key)
51             h = f - 1;
52         //在右半边
53         else
54             l = f + 1;
55     }
56     //没找到
57     return -1;
58 }
59 
60 //打印结果
61 void Display(int x){
62     if (x!=-1) {
63         for(i=0;i<z;i++){
64             if (x==a[i]) {
65                 printf("所在位置:%d\n",i);
66             }
67         }
68     }
69     
70     else{
71         printf("对不起,没有找到该数\n");
72     }
73 }

运行结果1:

请输入要查找的整数:200
所在位置:10
Program ended with exit code: 0

运行结果2:

请输入要查找的整数:500
对不起,没有找到该数
Program ended with exit code: 0

 

posted @ 2015-03-27 19:13  apple家园  阅读(342)  评论(0编辑  收藏  举报