折半查找的查找过程是,先确定待查找记录所在的范围,然后逐步缩小范围直到找到或者找不到该记录为止,和二分法求解有些相似。
若有记录如下
来看看查找32的过程,先比较数组的中间值,因为38>32,我们就知道,该记录可能会在前半部分,那么后半部分就不再考虑了。再次折半,拿27与32比较,得知记录在27与38之间。继续下去就会得到32=32,查找成功。查找开始时,设置low和high,mid=(low+hith)/2,如果a[mid]==记录,查找结束。若a[mid]>记录,记录可能在前半部,令high=mid。继续查找,若a[mid]<记录,可能在后半部,令low=mid。因为每次缩小一半的查找范围,所以效率比顺序查找高,但缺点是只适合有序表,及查找前先排序,且限于顺序存储结构。
代码如下(省略了排序)
//
// 折半
//
// Created by GPH on 13-7-3.
// Copyright (c) 2013年 GPH. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
//返回给定记录在数组中的位置,没有则返回-1
int binarySearch(int a[],int low,int high,int e)
{
int mid = 0;
while (low <= high)
{
mid = (low+high)/2;
if (e == a[mid])
{
return mid;
}
else if (e < a[mid])
{
high = mid-1;
}
else
{
low = mid+1;
}
}
return -1;
}
int main()
{
int b[] = {13,14,23,26,67,89,90};
printf("\n%d\n",binarySearch(b, 0, sizeof(b)/sizeof(b[0])-1, 26));
}