[C]算法 - 二分查找

来源:互联网 发布:淘宝买家秀入口 编辑:程序博客网 时间:2024/04/30 17:56

在网上也有很多例子,自己还是写个收藏起来,备用。

假设有三个指针,分别指向起始(low)中间(mid)末尾(high)

二分查找也叫做折半查找,前提要求是有序数组。

循环只要起始指针没有超过末尾指针,每次循环中间指针就到起始指针和末尾指针的中间。

因为每次都最先定位中间指针并判断,所以判断中间指针是否相等就可以了。

没找到的话要分两种情况:

第一种待找数在中间元素前面,定位末尾指针(high)到中间元素位置,因为已经比较过中间元素(mid),所以再左移一位避免重复比较提高效率。

第二种:待找数在中间元素后面,定位起始指针(low)到中间元素位置,因为已经比较过中间元素(mid),所以再右移一位避免重复比较提高效率。

复次循环,直到查找到指定元素跳出循环或者没有制定查找元素结束循环。

 

\"[C]二分查找

 

具体还是看代码(全注释版):

#include <stdio.h>
#define M 10//数组下标
void main()
{
 int a[M]={1,3,4,6,8,9,11,14,16,19};//定义待查找的有序数组
 int n,low,mid,high,flag;//定义变量:查找数、起始指针、中间指针、末指针
 n=11;//待查找的数
 flag=0;//标志变量,0为没找到,1为找到了
 low=0;//起始指针为第一个元素
 high=M-1;//末指针为最后一个元素
 while(low<=high)//起始指针不能大于末指针
 {
  mid=(high+low)/2;//中间指针
  if(a[mid]==n) //中间指针比较,找到,标记,跳出
  {
   flag=1;//标记为找到
   break;//跳出循环
  }
  if(a[mid]<n)//没找到,继续,看是在中间指针前还是后
  {
   low=mid+1;//在后的话,因为已经找过,为提高效率,指针右移1
  }
  else
  {
   high=mid-1;//同理在前的话,因为已经找过,为提高效率,指针左移1
  }
 }
 if(flag==1)//判断标识变量是否找到,并输出结果
 {
  printf(\"The Number %d is Index:%d \\n\",n,mid);//找到就是中间指针
 }
 else
 {
  printf(\"No Found!~~~\\n\");//没有找到
 }
}


 


二分查找的优点和缺点(转)

虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。

既使采用高效率的排序方法也要花费O(nlgn)的时间。

二分查找只适用顺序存储结构。

为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。

因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。

对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。

原创粉丝点击