二分检索来查找一个数据是很快速的一种方法是一种很优秀的算法。
我们现在有一个有序的数组我们需要查找它里面的一个元素。这时候我们应该怎么办呢,我们可以从这个数组的中间位置去查找。如果要寻找的数字比数组中间的数字大那么我们在这个数组的后半部分去查找,如果要寻找的数字比数组中间的数组小那么我们应该在这个数组的前半部分去查找。通过这样的方法我们可以比较快速地查找到这个元素。
先看Pseudocode语言所书写的伪代码
procedure BINSRCH(A,n,x,j)
//给定一个按非降次序排列的元素数组A(1:n),n≥1,判断x是否出现。若是,则置j,使得x=A(j),若非,j=0//
integer low,high,mid,j,n;
low<-1;high<-n
while low≤high do
mid<-⌊(low+high)/2⌋
case
:x<A(mid):high<-mid-1
:x>A(mid):low<-mid+1
:else:j<-mid;return j
end case
repeat
j<-0;return j
end BINSRCH
我们在这里可以看到主要是通过low和high还有mid来控制查询的,low和high是随着程序的运行而逐步发生改变的。程序是有出口的当我们发现low不是≤high的时候我们就可以退出了说明找不到。
这是我个人所书写的代码
#include<stdio.h>
#include<stdlib.h>
int w[7] = {0, 5, 10, 12, 13, 15, 18};//数组元素
int low;int high;int mid; int n;
void pd(int n,int low,int high){
if(low<=high){
mid=(low+high)/2;
if(n>w[mid-1]){
low=mid+1; pd(n,low,high);//low发生改变在重新调用该函数
}
if(n<w[mid-1]){
high=mid-1; pd(n,low,high);//high发生改变再重新调用该函数
}
if(n==w[mid-1]){
printf("查找成功\n");
printf("是数组中第%d个数字",mid);
exit(0);
}
}
else//查找失败了需要跳出去
printf("查找失败\n");
}
int main()
{
printf("输入你想要查找的数字\n");
scanf("%d",&n);
pd(n,1,7);
return 0;
}
这个算法是很简单的是很容易理解的,但是局限性是很明显的它必须要求是有序的数组这个限制就很大了
时间复杂度:
成功:最好 O(1)
平均 O(logn)
最坏 O(logn)
不成功: O(logn)