概念
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 [百度知道]
分析
1,通过三个数来查找,开始值(低位置),中间值(mid),末尾值(高位置),下文分别称low位置,mid值,high位置
2,用你想查找的key值做比较,
如果key值大于mid值,就把mid值当成开始值(即把mid值赋值给low位置),继续求平均值,继续跟提供的值做比较
如果是小于中间值那么旧把末尾值变成中间值的位置,继续刚刚的操作,
(如果看不明白,代码里有详细的分部详解)
3,二分查找法相较于冒泡和递归来说效率高很多,但缺点也显而易见,如果数组中有重复的数字,程序就崩溃了。(因为只能返回一个下标)
实例
例如查找数组{5,13,19,21,37,56,64,75,80,88,92}中21的下标

1, 先确定low,mid,high的位置(注意这几个都是下标)
mid=(high+low)/2
2, 用mid位置的值与21比较,21<56
3, 令mid=high-1;(减1的原因是已经知道56不等于21,就可以直接跳到前一个位置,提高效率)
4,此时low指向5,high指向37,再算出mid=(high+low)/2,得到mid指向19,
5,用21和此时的mid值作比较,21>19,
6,所以令mid=low+1;(加1为提高效率)
7,在比较就得到mid = low = 21 了 ,就是下图这样

代码
#include<stdio.h>
void main()
{
int ar[] = { 1, 23, 45, 65, 76, 87, 445, 77765, 34535, 234222, 999999 };
int n = sizeof(ar) / sizeof(ar[0]);
int key;
printf("请输入要查找的key值:>");
scanf("%d",&key);
int low = 0;
int high = n - 1; //高位置例如999999他的下标是10,而n为11,则高位置应该等于最后一个数字的下标即n-1
int mid, index = -1; //index是一个索引,初始化为-1没有什么意义,后面用作结果输出
while (low <= high)
{
mid = (low + high) / 2;
if (key == ar[mid])
{
index = mid;
break;
}
else if (key < ar[mid])
{
high = mid - 1;
}
else
low = mid + 1;
}
if (index == -1)
printf("要查找的%d不存在。。。\n",key);
else
printf("要查找的%d的下标为%d",key,index);
//
//二分查找(有序的) 前提是数组有序!!!
// low位置,mid位置,high位置,key值, (前三个都是下标,key是真值,注意ar[low]和low的区别)
//开始查找
// mid = (low + high)/2 ;
// if(ar[mid]==key) -->查找成功,输出key值=mid值=……
// if(ar[mid]< key) -->令mid=high+1,继续查找(再循环)
// if(ar[mid]> key) -->令mid=low-1, 继续查找(再循环)//-1没有其实也可以,但是有了会提高效率
///
}
4719

被折叠的 条评论
为什么被折叠?



