把学习过程中遇到的一些问也慢慢开始总结起来,主要也是一些好的代码、解题思路。
二分法的递归与非递归解法。
二分法要求有序,并且连续存放。
为什么要要求有序呢???
因为二分查找是建立在比较的基础上的,通过比较来缩小范围。
递归与非递归的代码。
#include <stdio.h>
#define MAXSIZE 10
typedef struct LNode *list;
struct LNode{
int Element[MAXSIZE];
int length; //存储元素的个数
};
int BinarySearch(list l,int num);
int BinarySearch2(list l,int num,int left,int right);
int main(){
int i,num,index;
list l;
l=(list)malloc(sizeof(struct LNode));
l->length=MAXSIZE;
for(i=0;i<l->length;i++){
l->Element[i]=i+1;
}
scanf("%d",&num);
//index=BinarySearch(l,num);
index=BinarySearch2(l,num,0,l->length-1);
printf("index:%d",index);
}
//非递归实现
int BinarySearch(list l,int num){
int mid,left,right,notFind;
left=0;
right=l->length-1;
notFind=-1;
while(left<=right){
mid=(left+right)/2;
if(l->Element[mid]>num) {
right=mid-1;
}else if(l->Element[mid]<num){
left=mid+1;
}else{
return mid;
}
}
return notFind;
}
//递归实现
int BinarySearch2(list l,int num,int left,int right){
int mid,notFind=-1;
mid=(left+right)/2;
if(left>right){ //设置递归出口
return notFind; //返回没有找到
}
if(l->Element[mid]>num){
return BinarySearch2(l,num,left,mid-1);
}else if(l->Element[mid]<num){
return BinarySearch2(l,num,mid+1,right);
}else{ //找到了
return mid;
}
}
第一次发文章,如果有错误的话,欢迎指正在这里插入代码片