折半查找:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找.不断重复上述过程,直到查找成功 或所有查找区域无记录,查找失败.
#include <stdio.h>
2 #include <stdlib.h>
3
4 //折半查找,又称为二分查找 ,条件保证要好排序的, 不适合应用在 频繁的插入操作,因为会打乱顺序
5 int Binary_Search(int *a,int n,int key)
6 {
7 int low,high,mid;
8 low = 0; //定义最低下标为记录首位
9 high = n; //记录最高下标为记录末位
10
11 while ( low <= high )
12 {
13 mid = (low + high) / 2;
14 if (key < a[mid]) {
15 high = mid - 1;//最高位下标调小 一位
16 } else if(key > a[mid]){
17 low = mid + 1; //最低下标调整到中位下标大一位
18 } else{
19 return mid; //代表就是次位置
20 }
21 }
22 return -1; //没有找到返回-1
23 }
24
25 void main()
26 {
27 int a[] = {1,2,3,4,5,6,7,8,9,10};
28
29 //需求要查找8, 如果用传统的方式 要查找8次才能得出
30 int index;
31 index = Binary_Search(a, sizeof(a) / sizeof(int),8);
32
33 if (index == -1)
34 printf("没有找到");
35 else
36 printf("找到了,index为:%d",index);
37 }