二分查詢遞迴和非遞迴實現(c語言實現)
int seeqSearch(int a[],int n,int k){
int i=n-1;
for(;i>=0;i--){//遍歷陣列
if(a[i]==k){//找到對應的陣列
return i;//返回該陣列的下標
}
}
return -1;//失敗返回值為-1
}
int binSearch(int a[],int n,int k){
int mid,hig,low;//定義指向中間高位和low的元素
hig=n-1;//為高位指標賦初值
low=0;//地位賦初值
while(low<=hig){//到low大於hig時代表未找到退出迴圈
mid=(hig+low)/2;//為mid賦值
if(a[mid]==k){
return mid;//當找到到的時候返回該數的下標
}
else if(a[mid]>k){//如果當前的數的值大於k
hig=mid-1;//當前的mid-1賦值給hig
}
else if(a[mid]<k){//如果當前的數的值小於k
low=mid+1;//當前的mid+1賦值給low
}
}
return -1;//失敗返回-1
}
int binSearch2(int a[],int low,int hig,int k){//此方法為遞迴演算法
int mid;//定義指向中間的指標
if(low>hig){
return -1;
}else{
mid=(hig+low)/2;//為mid賦值
if(a[mid]==k){
return mid;//當找到到的時候返回該數的下標
}
else if(a[mid]>k){//如果當前的數的值大於k
binSearch2(a,low,mid-1,k);//呼叫遞迴演算法
}
else if(a[mid]<k){//如果當前的數的值小於k
binSearch2(a,mid+1,hig,k);//呼叫遞迴演算法
}
}
}
int main(){
int a[10001];//定義一個數組用來存放元素
int n,i=0;//定義一個存放個數和計數器
printf("請輸入你要輸入的元素的個數:");
scanf("%d",&n);
while(n--){
printf("\n這是你要存入的第%d個元素:\n",i+1);
scanf("%d",&a[i]);
i++;
}
n=i;
printf("請輸入你要查詢的元素的數值:\n");
int k;
scanf("%d",&k);
i=seeqSearch(a,n,k);//首先是進行順序查詢得到下標
if(i==-1){//當返回值為-1代表沒有查到
printf("你撥打的使用者不在伺服器,請稍後在撥!!!\n");
return 0;
}
printf("查詢到的元素是第%d個\n",i+1);//列印輸出得到的下標的數
i=binSearch(a,n,k);//其次是進行二分查詢得到下標
printf("查詢到的元素是第%d個\n",i+1);//列印輸出得到的下標的數
i=binSearch2(a,0,n-1,k);//遞迴演算法
printf("查詢到的元素是第%d個\n",i+1);//列印輸出得到的下標的數
return 0;
}