C 二分查找 递归与非递归的实现代码

时间:2021-05-20

复制代码 代码如下:
#include <stdio.h>

int binSearch(int arr[], int low, int high, int key);
int binSearch2(int arr[], int low, int high, int key);
int binSearch3(int arr[],int start,int ends,int key);
int main() {
int arr[]={3,8,11,15,17,22,23,26,28,29,34};
//printf("%d",binSearch(arr,0,10,26));
printf("%d",binSearch3(arr,0,10,26));
return 1;
}

int binSearch(int arr[], int low, int high, int key) {
int flag=-1;
int mid = (low + high) / 2;
if (low > high) {
flag= -1;
} else {

if (arr[mid] < key) {
flag= binSearch(arr, mid + 1, high, key);
} else if (arr[mid]>key) {
//比如要找的节点在下面这一层 那么这一层会返回下标上来 用flag接住嘛...
flag= binSearch(arr,low,mid-1,key);//又差一点忘记了用flag取接住返回值了

} else {
flag= mid;
}
}
return flag;
}


//ok==============================
int binSearch2(int arr[], int low, int high, int key) {
int mid = (low + high) / 2;
if (low > high) {
return -1;
} else {

if (arr[mid] < key) {
return binSearch2(arr, mid + 1, high, key);
} else if (arr[mid]>key) {
return binSearch2(arr,low,mid-1,key);
} else {
return mid;
}
}

}

int binSearch3(int arr[],int start,int ends,int key){
int mid=-1;
while(start<=ends){
mid=(start+ends)/2;
if(arr[mid]<key){
start=mid+1;
}else if(arr[mid]>key){
ends=mid-1;
}else{
break;
}
}//上述循环结束后不一定就是 start>ends的 因为有break语句
if(start>ends){
mid=-1;
}
return mid;
}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章