ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构(16) - 折半查找(二分查找)

2022-06-25 18:35:20  阅读:169  来源: 互联网

标签:折半 search 16 int 元素 len 查找 key printf


在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

 

 1 /**
 2  * C data structure binary search example.
 3  * 
 4  * License - MIT.
 5 */
 6 
 7 #include <stdio.h>
 8 
 9 
10 #define DISPLAY_ARRAY(i, buf, len) \
11         do { \
12             for (i = 0; i < len; i++) \
13                 printf("%d ", buf[i]); \
14             printf("\n"); \
15         } while(0)
16 
17 
18 /**
19  * binary_search - Binary search.
20 */
21 int binary_search(int *buf, int len, int key)
22 {
23     int low = -1,
24         mid = -1,
25         high = -1;
26 
27     for (low = 0, high = len - 1; low <= high;) {
28         mid = (low + high) / 2;
29 
30         if (key == buf[mid]) {
31             return mid;
32         }
33         else if (key < buf[mid]) {
34             high = mid - 1;
35         }
36         else {
37             low = mid + 1;
38         }
39     }
40     
41     return -1;
42 }
43 
44 
45 /**
46  * Main function.
47 */
48 int main(void)
49 {
50     int i = 0;
51     int ret = -1;
52     int key = 10;
53     int buf[] = {9, 10, 13, 28, 34, 36, 38, 63, 85, 97};
54     int len = sizeof(buf) / sizeof(int);
55 
56     printf("The original array:\n");
57     DISPLAY_ARRAY(i, buf, len);
58 
59     ret = binary_search(buf, len, key);
60 
61     if (0 > ret) {
62         printf("Not found key: %d.\n", key);
63     }
64     else {
65         printf("Find key %d at index: %d.\n", key, ret);
66     }
67 
68     return 0;
69 }

 

详情可参考Github: [Link] [https://github.com/Phoebus-Ma/C-Helper/tree/main/Class-1/Search.C].

标签:折半,search,16,int,元素,len,查找,key,printf
来源: https://www.cnblogs.com/tinyshark/p/16412141.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有