二分查找算法
一、问题描述;
二分查找法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
二、代码;
1、递归实现
//二分查找(递归实现)
#include<stdio.h>
void ERSearch(int a[], int l, int r, int x);
int main()
{
int i, a[100], x;
printf("Please input x:\n");
scanf("%d", &x);
for(i = 0; i < 100; i++){
a[i] = i + 1;
}
ERSearch(a, 0, 99, x);
return 0;
}
void ERSearch(int a[], int l, int r, int x)
{
int m; //中间元素的下标
if(l > r && r > 0){ //递归结束条件,数组长度要大于零
printf("Not found!\n");
}
else{
m = (r + l) / 2;
if (a[m] > x){
ERSearch(a, l, m - 1, x);
}
else{ // 小于或者等于的情况
if(a[m] < x){
ERSearch(a, m + 1, r, x);
}
else{ //等于的情况,即找到了
printf("Find it!\n");
}
}
}
}
2、非递归实现;
<span style="color:#ff0000;">//二分查找(非递归实现)
#include<stdio.h>
void ERSearch(int a[], int n, int x);
int main()
{
int i, a[100], x;
printf("Please input x:\n");
scanf("%d", &x);
for(i = 0; i < 100; i++){
a[i] = i + 1;
}
ERSearch(a, 99, x);
return 0;
}
void ERSearch(int a[], int n, int x)
{
int i, j, m, flag = 1; //fiag用来说明找到没有
if(n > 0){
for (i = 0, j = n; j >= i && flag;){ //加上flag,找到就退出
m = (i + j) / 2;
if (a[m] > x){
j = m - 1;
}
else{
if (a[m] < x){
i = m + 1;
}
else{
printf("Find it!\n");
flag = 0;
}
}
}
if (flag){
printf("Not find!\n");
}
}
}</span>
三、心得总结;
在编写时,除了知道它的基本思想之外,还要特别注意的是折半的时候对该数进行加减一操作,否则,容易陷入无休止的计算中。