(一)二分查找有一个前提条件:所查找的数组必须是有序的。
(二)查找过程如下(假设需要查找的数保存在变量item中):
1.设数组的第一项索引为low,最后一项索引为hight,中间项索引为mid(这里我用“mid”表示中间项的值,“low”表示第一项的值,"high"表示最后一项的值);
2.比较“mid”与item;
3.若“mid”>item,则表明item位于数组的前半部分,所以设置high的值为mid-1;
4.若“mid”<item,则表明item位于数组的后半部分,所以设置low的值为mid+1;
5.若high>low,设置mid为(low+hight)/2(即low到high的中间项),返回步骤2;
6.直到查到了一项与item相等,或者high<low为止;
7.判断“mid”与item是否相等,若相等则表明查找成功,否则表明查找失败(即未找到)。
(三)下面是我用c语言实现二分查找的代码(关键代码为函数search):
1 #include<stdio.h> 2 int main() 3 { 4 void order(int a[], int n); 5 int search(int a[], int n, int item); 6 void output(int a[], int n); 7 int a[] = { 10,99,22,90,46,89,55,88,60,70 }; 8 int item, index; 9 printf("请输入需要查询的数字:"); 10 scanf_s("%d", &item); 11 order(a, 10); 12 index = search(a, 10, item); 13 output(a, 10); 14 if (index != -1) 15 { 16 printf("%d为数组的第%d项。", item, index); 17 } 18 else 19 { 20 puts("未找到。"); 21 } 22 } 23 24 //输出数组 25 void output(int a[], int n) 26 { 27 int i; 28 for (i = 0; i < n; i++) 29 { 30 printf("a[%d] = %d ", i, a[i]); 31 } 32 } 33 34 //排序-升序 35 void order(int a[], int n) 36 { 37 int i, j, v; 38 for (i = 0; i < n; i++) 39 { 40 for (j = 0; j < n - i - 1; j++) 41 { 42 if (a[j] > a[j + 1]) 43 { 44 v = a[j], a[j] = a[j + 1], a[j + 1] = v; 45 } 46 } 47 } 48 } 49 50 //查找-二分查找 51 int search(int a[], int n, int item) 52 { 53 int low = 0, high = n - 1, mid = 0; 54 do 55 { 56 mid = (low + high) / 2; 57 if (item > a[mid]) 58 { 59 low = mid + 1; 60 } 61 else 62 { 63 high = mid - 1; 64 } 65 } while (high >= low && a[mid] != item); 66 if (a[mid] == item) 67 { 68 return mid; 69 } 70 else 71 { 72 return -1; 73 } 74 }