设计一个算法,实现折半查找,很简单的问题。在这里列举下递归和非递归
递归实现
#include <iostream> #include <cstdio> #include <ctime> #include <cstdlib> #include <stack> #include <algorithm> #include <queue> using namespace std; int n,a[105]; int Search_Bin(int stat,int end,int tmp) { int i,j; if(stat>end) return -1; if(stat==end) { return stat; } if(tmp==a[(stat+end)/2]) { return (stat+end)/2; } if(tmp>a[(stat+end)/2]) { return Search_Bin((stat+end)/2+1,end,tmp); } else if (tmp<a[(stat+end)/2]) { return Search_Bin(stat,(stat+end)/2-1,tmp); } } int main() { int i,j,tmp; printf("请输入你要随机产生的数的个数\n"); scanf("%d",&n); srand(time(0)); for(i=0;i<n;i++) { a[i]=rand()%1000; } sort(a,a+n); printf("随机产生的数排序后的answer是\n"); for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); printf("请输入你要查找的数\n"); scanf("%d",&tmp); printf("该数所在的位置是%d个\n",Search_Bin(0,n-1,tmp)+1); return 0; }
非递归实现
#include <iostream> #include <cstdio> #include <ctime> #include <cstdlib> #include <stack> #include <algorithm> #include <queue> using namespace std; int n,a[105]; int Search_Bin(int stat,int end,int tmp) { int i,j; printf("该数所在的位置是"); while(stat<=end) { if(stat==end) { printf("%d\n",stat+1); break; } if(tmp==a[(stat+end)/2]) { printf("%d\n",stat+1); break; } if(tmp>a[(stat+end)/2]) stat=(stat+end)/2+1; else if(tmp<a[(stat+end)/2]) end=(stat+end)/2-1; } } int main() { int i,j,tmp; printf("请输入你要随机产生的数的个数\n"); scanf("%d",&n); srand(time(0)); for(i=0;i<n;i++) { a[i]=rand()%1000; } sort(a,a+n); printf("随机产生的数排序后的answer是\n"); for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); printf("请输入你要查找的数\n"); scanf("%d",&tmp); Search_Bin(0,n-1,tmp)+1; //printf("该数所在的位置是%d个\n",Search_Bin(0,n-1,tmp)+1); return 0; }