折半查找

来源:互联网 发布:西安项目数据分析公司 编辑:程序博客网 时间:2024/06/07 05:28

      折半查找的查找过程是,先确定待查找记录所在的范围,然后逐步缩小范围直到找到或者找不到该记录为止,和二分法求解有些相似。

若有记录如下

      来看看查找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>//返回给定记录在数组中的位置,没有则返回-1int 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));    }


0 0