二分查找
在程序设计的过程中不可避免的需要对数组中特定元素进行查找,在所有的查找算法中二分查找还算比较理想的一种查找方法,接下来我将用两种方法对数组进行二分查找。
注:
1、所用数组已经进行了升序排列
2、所有代码所用语言为C语言
一、递归
#include<stdio.h>
void Find(int *a,int b,int Sizeal,int Sizear);
int main(void){
int a[10]={1,2,3,4,5,6,7,8,9,10}; //被查找的数组
int b; //储存所需要查找的数字
scanf("%d",&b);
int Sizeal=0,Sizear=10;
Find(a,b,Sizeal,Sizear); //Sizeal:数组左端点,Sizear:数组右端点
return 0;
}
void Find(int *a,int b,int Sizeal,int Sizear){
int n;
n=(Sizeal+Sizear)/2; //n:数组的中间元素角标
if(a[n]<b&&Sizeal!=n) //判断中间元素与所寻找元素的大小比较
Find(a,b,n,Sizear); //缩小查找范围
else if(a[n]>b&&Sizeal!=n) //判断中间元素与所寻找元素的大小比较
Find(a,b,Sizeal,n); //缩小查找范围
else if(a[n]==b)
printf("%d",n);
else
printf("未查到该值!");
}
时间复杂度:由于每次都将所查找的数组折半,所以
2
t
=
n
2^t=n
2t=n,所以时间复杂度:
O
(
log
2
n
)
O(\log_2n)
O(log2n)
空间复杂度:由于使用递归所以递归所开辟的空间为:
O
(
n
)
O(n)
O(n)
二、循环
基本思想与递归相同
#include<stdio.h>
int main(void){
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b,Sizeal=0,Sizear=10;
int n;
scanf("%d",&b);
do{
n=(Sizeal+Sizear)/2;
if(a[n]>b&&Sizeal!=n) //判断中间元素与所寻找元素的大小比较
Sizear=n; //缩小查找范围
else if(a[n]<b&&Sizeal!=n) //判断中间元素与所寻找元素的大小比较
Sizeal=n; //缩小查找范围
else if(a[n]==b){
printf("%d",n);
break;
}
else{
printf("未查到该值!");
break;
}
}while(1);
return 0;
}
时间复杂度:
O
(
log
2
n
)
O(\log_2n)
O(log2n)
空间复杂度:因为用的量都为常亮所以空间大小为:
O
(
1
)
O(1)
O(1)