c语言趣味编程(9)折半查找
一、问题描述
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语句跳出此次循环,执行下一次循环;