二分查找的算法思想和实现过程

1.二分查找:

又称为 折半查找,二分查找,适合对已经排序好的数据集合进行查找,时间复杂度O(log2n),效率高。假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,,如果等于key则返回,如果大于关键字key,则在前一个数据集合中查找,否则在后一个子集中查找,直到找到为止,如果没找到则返回-1;

2.算法步骤描述:

(1)首先确定整个查找区间的中间位置mid=(low+high)/2;

(2)用待查关键字值与中间位置关键字值进行比较;

若相等,则查找成功;

若大于,则在后半个区域中继续进行折半查找。

若小于,则在前半个区域中继续进行折半查找。

查找成功,返回关键字所在数组下标,没找到返回-1;

3.代码:

#include<stdio.h>
#include<stdlib.h>
//二分查找非递归方式
int HalfSearch(int a[],int low,int high,int key)
{
    int mid;
    while(low<=high)
    {
      mid=(low+high)/2;//二分点
        if(a[mid]==key) return mid;
        else if(a[mid]<key) low=mid+1;
        else high=mid-1;
    }
    return -1;
}
//二分查找递归方式
int HalfSearch1(int a[],int low,int high,int key)
{
    int mid;
    if(low>high) return -1;//没找到,递归结束
    else{
        mid=(low+high)/2;
        if(a[mid]==key) return mid;//找到了,递归结束
        else if(a[mid]<key)  return HalfSearch(a,mid+1,high,key);//右递归
        else return HalfSearch(a,low,mid-1,key);//左递归
    }
}
int main(void)
{
    int a[10]={12,22,34,65,76,78,89,90,121,145};
    int n;
    int key;
    printf(“enter data to key:\n”);
    scanf(“%5d”,&key);
    n=HalfSearch1(a,0,9,key);
    if(n==-1) printf(“not found!\n”);//没找到
    else  printf(“key=%d”,a[n]);
    return 0;
}

    原文作者:查找算法
    原文地址: https://blog.csdn.net/xingbingle/article/details/51747030
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞