数据结构(16) - 折半查找(二分查找)
在计算机科学中,折半搜索(英语: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].