二分查找

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

查找过程如下(假设需要查找的数保存在变量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 }

 

转载于:https://www.cnblogs.com/ben-/p/11223258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值