例如 :13 44 77 90 127 189 242 3549
(1)定义一个变量key用于存放要查找的数字242
key = 242
(2) 定义变量low、mid和high分别存储数组的最小下标、中间下标和最大下标。并有:
mid = (low+hight)/2 = (0 + 7)/2 = 3
(3)此时a[3] = 90, 而key > 90,说明了242在90的右边,则往后查找:
low = mid + 1 = 4
(4)然后冲新重新定义mid
mid = (4 + 7)/2 = 5
(5)此时a[5] = 189, 而key > 189,说明242在189的右边,继续往后查找:
low = mid + 1 = 6
(6)然后重新更新mid:
mid = (6 + 7) = 6
(7)此时a[6] = 242,找到了
再找一下key = 77:
(1)key = 77, mid = (low + high)/2 = (0+7)/2 = 3
(2) 此时 a[3] = 90,而key < 90,说明了77在90的左边,则往前查找:
high = mid -1 = 2
(3)然后重新更新mid:
mid = (0 + 2)/2 = 1
(4) 此时a[1] = 44,而key > 45,说明77在44的右边,则往后查找
low = 1 + 1 = 2
(5)然后更新mid
mid = (2 + 2)/2 = 2
(6)此时a[2] = 77 ,就找到了
若所查找的数据在数组中没有的话,比如查找124
(1)key = 123, mid = (low + high) /2 = (0 + 7) = 3
(2) 此时a[3] = 90,key > 90 说明了124在90的右边,则往后查找:
low = mid + 1 = 4
(3)然后重新更新mid
mid = (4 + 7) = 5
(4) 此时a[5] = 189, key < 189 ,说明了124在189的左边,则往左边查找:
(5) hight = mid - 1 = 4
(6)此时low == high ,如果该数任不是要找的数的话,说明该序列中就没有该数了
程序代码如下:
/** * 二分查找 * @return */ #includeint main() { int a[] = {13, 44, 77, 90, 127, 189, 242, 3549}; int key; //存放要查找的数 int low = 0; int high = sizeof(a) / sizeof(a[0]); int mid; int flg = 0; //标志位,用于判断是否存在要找的数 printf("请输入您要查找的数据:"); scanf("%d", &key); while ((low <= high)) { mid = (low + high) / 2; if(key < a[mid]) { high = mid - 1; } else if (a[mid] < key) { low = mid + 1; } else { printf("下标 = %d\n", mid); flg = 1; break; } } if (flg == 0) { printf("sorry, data is not found \n"); } return 0; }