二分查找法(又称折半查找):
二分查找法的前题是:序列有序情况下且为顺序存储结构。
其优点是查找速度快,缺点是要求所要査找的数据必须是有序序列。
假设有一组序列:
arr[] = [-32, 12, 16, 24, 36, 45, 59, 98]
要查找的关键数 key=12,将所要査找的序列的中间下标的数据与所要査找的元素进行比较,如果相等,则表示査找成功;若不相等,则将整个序列拆成左右两半部分,判断key值在哪部分,进而继续进行查找操作。这里使用角标值辅助判断,具体实现如示例所示:
具体C语言实现程序如下:
1. #include <stdio.h>
2. binSearch(int a[], int n, int key){ //a[]代表数组序列,n代表数组序列的n个元素,key代表要查找的关键数
3. int lowIndex = 0;
4. int highIndex = n - 1;
5. while(lowIndex <= highIndex){ //循环终止的条件
6. int midIndex = (lowIndex + highIndex)/2;
7. int midValue = a[midIndex];
8. if(midValue<key)
9. lowIndex = midIndex + 1;
10. else if(midValue>key)
11. highIndex = midIndex - 1;
12. else
13. return midIndex;
14. }
15. return -1; //不满足while循环条件
16. }
17. int main(){
18. int i, keyValue, result;
19. int a[8]={13, 15, 19, 28, 33, 45, 78, 106};
20. for(i=0; i<8; i++)
21. printf("%d\t", a[i]);
22. printf("\n请输入要查找的元素值:");
23. scanf("%d",&keyValue);
24. result = binSearch(a,8,keyValue);
25. if(-1 == result)
26. printf("查找失败 \n");
27. else
28. printf ("查找成功 \n");
29. return 0;
30. }