二分查找函数
问题1:
-
写一个函数BinarySearch,在包含size个元素的、从小到大排序的int数组a里查找元素p,如果找到,则返回元素下标,如果找不到,则返回-1。要求复杂度O(log(n))
-
C语言示例
#include<stdio.h>
int BinarySearch(int a[], int size, int p){
int L = 0;//查找区间的左端点
int R = size - 1;//查找区间的右端点
int mid = 0;
while( L <= R) {//如果查找区间不为空就继续查找
mid = L+(R-L)/2;//取查找区间正中元素的下标
if( p == a[mid])
return mid;
else if( p > a[mid] )
L = mid + 1;//设置新的查找区间的左端点
else
R = mid - 1;//设置新的查找区间的右端点
}
return -1;
}//复杂度O(log(n))
int main(){
int array[100], len=0, size = 0;
int p = 0;
printf("请输入数组长度(<100):");
scanf("%d",&len);
printf("请从小到大输入%d个数\n", len);
size = len;
while(len--){
scanf("%d",&array[size-len-1]);
}
printf("请输入所要查询的数字P:");
scanf("%d", &p);
printf("所要查询数字的位置在a[%d]上。\n", BinarySearch(array, size, p));
return 0;
}
- 运行示例
问题2:
-
写一个函数LowerBound,在包含size个元素的、从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素。找到则返回其下标,找不到则返回-1。
-
C语言示例
#include<stdio.h>
int LowerBound(int a[], int size, int p){
int L = 0;
int R = size-1;
int lastPos = -1;
int mid = 0;
while( L <= R){
mid = L+(R-L)/2;
if(a[mid] >= p)
R = mid-1;
else{
lastPos = mid;
L = mid+1;
}
}
return lastPos;
}
int main(){
int array[100], len=0, size = 0;
int p = 0;
printf("请输入数组长度(<100):");
scanf("%d",&len);
printf("请从小到大输入%d个数\n", len);
size = len;
while(len--){
scanf("%d",&array[size-len-1]);
}
printf("请输入所要查询的数字P:");
scanf("%d", &p);
printf("所要查询数字的位置在a[%d]上。\n", LowerBound(array, size, p));
return 0;
}
-
运行示例
注:文中问题及代码参考 MOOC——《程序设计与算法》(北京大学 郭炜) -
算法系列目录:
- 一、递归形式的问题
- 二、程序或算法的时间复杂度
- 三、二分算法