基础算法之二分法查找
二分查找算法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