折半查找的递归算法和非递归

时间:2021-11-12 04:13:10

设计一个算法,实现折半查找,很简单的问题。在这里列举下递归和非递归

递归实现

#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;
}