[C]算法 - 二分查找
来源:互联网 发布:淘宝买家秀入口 编辑:程序博客网 时间:2024/04/30 17:56
在网上也有很多例子,自己还是写个收藏起来,备用。
假设有三个指针,分别指向起始(low),中间(mid),末尾(high)。
二分查找也叫做折半查找,前提要求是有序数组。
循环只要起始指针没有超过末尾指针,每次循环中间指针就到起始指针和末尾指针的中间。
因为每次都最先定位中间指针并判断,所以判断中间指针是否相等就可以了。
没找到的话要分两种情况:
第一种:待找数在中间元素前面,定位末尾指针(high)到中间元素位置,因为已经比较过中间元素(mid),所以再左移一位避免重复比较提高效率。
第二种:待找数在中间元素后面,定位起始指针(low)到中间元素位置,因为已经比较过中间元素(mid),所以再右移一位避免重复比较提高效率。
复次循环,直到查找到指定元素跳出循环或者没有制定查找元素结束循环。
具体还是看代码(全注释版):
#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)的时间。
二分查找只适用顺序存储结构。
为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。
因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。
- C 二分查找算法
- c 二分查找算法
- [C]算法 - 二分查找
- C 二分查找算法
- C 二分查找算法
- 算法:二分查找算法(c++)
- C语言版二分查找算法
- c语言二分查找算法
- C查找算法——二分查找
- 二分查找算法的C/C++实现
- C语言实现二分查找算法
- C语言实现二分查找算法
- 【C语言】二分查找递归算法
- 算法之二分查找【C语言】
- 二分查找算法的C语言实现
- c语言实现二分查找算法
- 用C语言实现二分查找算法
- 算法四 二分查找 java,c,c++
- 牛人视频集合
- Android SDK Windows安装教程图解
- Win7疑难杂症之保存对话框没有桌面
- 【黑客小说】-黑客传说
- HTML+CSS 首字下沉效果实现
- [C]算法 - 二分查找
- [WordPress]数据库中的表、字段、类型及说明
- [WordPress]模板相关文件结构与函数
- [WordPress]时间函数和参数
- [WordPress]偷窥别人的主题信息
- [PHP]PHP.ini配置文件(中文)
- 免费注册.TK域名一枚(isaced.tk)
- Visual Studio 2011 新功能
- [jQuery]第一次接触jQuery1.7.1正好发布新版。缘分呐!