二分查找(用c语言实现)

(一)二分查找有一个前提条件:所查找的数组必须是有序的。

(二)查找过程如下(假设需要查找的数保存在变量item中):

        1.设数组的第一项索引为low,最后一项索引为hight,中间项索引为mid(这里我用“mid”表示中间项的值,“low”表示第一项的值,"high"表示最后一项的值);

        2.比较“mid”与item;

        3.若“mid”>item,则表明item位于数组的前半部分,所以设置high的值为mid-1;

        4.若“mid”<item,则表明item位于数组的后半部分,所以设置low的值为mid+1;

        5.若high>low,设置mid为(low+hight)/2(即low到high的中间项),返回步骤2;

        6.直到查到了一项与item相等,或者high<low为止;

        7.判断“mid”与item是否相等,若相等则表明查找成功,否则表明查找失败(即未找到)。

(三)下面是我用c语言实现二分查找的代码(关键代码为函数search):

 1 #include<stdio.h>
 2 int main()
 3 {
 4     void order(int a[], int n);
 5     int search(int a[], int n, int item);
 6     void output(int a[], int n);
 7     int a[] = { 10,99,22,90,46,89,55,88,60,70 };
 8     int item, index;
 9     printf("请输入需要查询的数字:");
10     scanf_s("%d", &item);
11     order(a, 10);
12     index = search(a, 10, item);
13     output(a, 10);
14     if (index != -1)
15     {
16         printf("%d为数组的第%d项。", item, index);
17     }
18     else
19     {
20         puts("未找到。");
21     }
22 }
23 
24 //输出数组
25 void output(int a[], int n)
26 {
27     int i;
28     for (i = 0; i < n; i++)
29     {
30         printf("a[%d] = %d\n", i, a[i]);
31     }
32 }
33 
34 //排序-升序
35 void order(int a[], int n)
36 {
37     int i, j, v;
38     for (i = 0; i < n; i++)
39     {
40         for (j = 0; j < n - i - 1; j++)
41         {
42             if (a[j] > a[j + 1])
43             {
44                 v = a[j], a[j] = a[j + 1], a[j + 1] = v;
45             }
46         }
47     }
48 }
49 
50 //查找-二分查找
51 int search(int a[], int n, int item)
52 {
53     int low = 0, high = n - 1, mid = 0;
54     do
55     {
56         mid = (low + high) / 2;
57         if (item > a[mid])
58         {
59             low = mid + 1;
60         }
61         else 
62         {
63             high = mid - 1;
64         }
65     } while (high >= low && a[mid] != item);
66     if (a[mid] == item)
67     {
68         return mid;
69     }
70     else
71     {
72         return -1;
73     }
74 }

 

posted @ 2019-07-21 22:55  奔_gis  阅读(3319)  评论(0编辑  收藏  举报