折半查找

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

若有记录如下

      来看看查找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));
    
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值