c语言趣味编程(9)折半查找

发布时间 2023-04-27 15:19:03作者: 我爱软工

一、问题描述

N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置,若找到,则输出其下标值;反之,则输出“NO ".

二、设计思路

(1)从键盘接收一个寻找的值m;

(2)定义一个low作为初始下标,high作为最末尾的下标;

(3)定义mid=(low+high)/2;

(4)将m与数组中下标为mid的元素比较,若m<此数,则重新给high赋值,为mid-1;若m>此数,则给low重新赋值为mid-1;

(5)如此循环下去,直到在数组中找到m或者low<=high;

(6)如果找到m,输出对应的下标,如果没找到,输出”NO“;

 

三、程序流程图

 

四、伪代码

五、代码

 1 #include <iostream>
 2 using namespace std;
 3 #define N 10
 4 int main()
 5 {
 6     int a[N] = { 0,3,5,16,23,49,50,52,60,90 };
 7     int m = 0, low = 0, high = N - 1, k = -1;
 8     for (int i = 0; i < N; i++)
 9     {
10         cout << a[i] << " ";
11     }
12     cout << endl;
13     cin >> m;
14     int mid = 0;
15     while (low <= high)
16     {
17         mid = (low + high) / 2;
18         if (m < a[mid])
19         {
20             high = mid - 1;
21         }
22         else
23         {
24             if (m > a[mid])
25             {
26                 low = mid + 1;
27             }
28             else
29             {
30                 k = mid;
31                 break;  //跳出循环
32             }
33         }
34     }
35     if (k >= 0)
36     {
37         cout << "m=" << m << endl;
38         cout << "k=" << k << endl;
39     }
40     else
41     {
42         cout << "NO" << endl;
43     }
44     return 0;
45 }

运行结果:

 

六、总结

(1)折半查找相比一般查找来说速度更快,效率高;

(2)break语句跳出循环,continue语句跳出此次循环,执行下一次循环;