Chinaunix首页 | 论坛 | 博客
  • 博客访问: 699347
  • 博文数量: 152
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1793
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 12:26
个人简介

相信自己,只有不想做的,没有做不到的。

文章分类

全部博文(152)

文章存档

2021年(1)

2015年(2)

2014年(74)

2013年(75)

分类: LINUX

2014-01-22 12:51:42

        二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
假设其长度为n,其算法复杂度为o(log(n))
下面提供一段二分查找实现的:
BinarySearch(max,min,des)
mid-<(max+min)/2
while(min<=max)
mid=(min+max)/2
if mid=des then
return mid
elseif mid >des then
max=mid-1
else
min=mid+1
return max
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果xa[n/2],则我们只要在a的右 半部继续搜索x。
二分查找法一般都存在一个临界值的BUG,即查找不到最后一个或第一个值。可以在比较到最后两个数时,再次判断到底是哪个值和查找的值相等。


C语言代码

    
int BinSearch(SeqList *R, int n , KeyType K)
{
    //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1
    int low=0,high=n-1,mid; //置当前查找区间上、下界的初值
    if(R[low].key==K)
        return low ;
    if(R[high].key==k)
        return high;
    while(low<=high)
    {
        //当前查找区间R[low..high]非空
        mid=low+((high-low)/2);
        //使用 (low + high) / 2 会有整数溢出的问题
        //(问题会出现在当low + high的结果大于表达式结果类型所能表示的最大值时,
        //这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题
        if(R[mid].key==K)
            return mid; //查找成功返回
        if(R[mid].key>K)
            high=mid-1; //继续在R[low..mid-1]中查找
        else
            low=mid+1; //继续在R[mid+1..high]中查找
    }
    if(low>high)
    return -1; //当low>high时表示查找区间为空,查找失败
} //BinSeareh

Java代码


public static int binarySearch(Integer[] srcArray, int des) {
    int low = 0;
    int high = srcArray.length - 1;
    while (low <= high) {
        int middle = low + ((high - low)>>>1);
        if (des == srcArray[middle]) {
            return middle;
        } else if (des < srcArray[middle]) {
            high = middle - 1;
        } else {
            low = middle + 1;
        }
    }
    return -1;
}


C++代码

int binSearch(const int *Array,int start,int end,int key){
    int left,right;
    int mid;
    left=start;
    right=end;
    while (left<=right) {
        /注释中为递归算法,执行效率低,不推荐
        /*
        if (key
            return(binSearch(Array,left,mid,key));
        }else if(key>Array[mid]){
            return (binSearch(Array,mid+1,right,key));
        }else
            return mid;
        */
        mid=(left+right)/2;
        if (key
            right=mid-1;
        }else if(key>Array[mid]){
            left=mid+1;
        }else
            return mid;
    }
    return -1;
}

阅读(1290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~