对分查找、欧几里得算法、幂运算

对分查找

  • 算法思想
基本思想:
首先该数组必须是已经排序的数组,验证查找的数是否是居中的元素,如果是,则答案就找到了。如果该数小于中间的元素,则用同样的策略在居中元素的左边的序列继续查找;如果该数大于中间的元素,则用同样的策略在居中元素的右侧继续查找。最后如果找到则返回数组中元素的序号,否则查找完没有找到就终止查找。
算法步骤:
1.首先给搜索范围赋初值,Low=0,High=N-1;
2.只要Low<=High,及下界没有超过上届就一直循环;
3.循环体首先得到上下界的中间位置,然后判断所查找的数是大于中间元素,就将下界变为中间值+1,去右边空间查找;否则,判断查找的数是否小于中间元素,如果小于中间元素,就将上届赋值为中间值-1,去左边空间查找;否则就代表说查找的数等于中间元素,将中间值返回;
4.如果Low>High,表示已经查找完所有的元素,并没有输出结果,表明查找的数不在此数组中,返回-1。
  • 运行时间
O(log N)
  • 算法实现
int BinarySearch(int A[], int X, int N)
{
	int Low, Mid, High;
	int NotFound = -1;
	Low = 0;
	High = N - 1;
	while (Low <= High)
	{
		Mid = (Low + High) / 2;
		if (A[Mid] < X)
			Low = Mid + 1;
		else
			if (A[Mid] > X)
				High = Mid - 1;
			else
				return Mid;
	}
	return NotFound;
}



欧几里得算法

  • 算法思想
基本思想:
两个整数的最大公因数(Gcd)是同时整除二者的最大整数。通过连续计算余数直到余数是0为止,最后的非零余数就是最大公因数。通过依次减小余数计算两个数的最大公因数。
算法步骤:
1.定义一个中间变量存储余数;
2.只要余数大于0就表明没有找到最大公因数就,就一直迭代;
3.在循环体中首先计算两个数的余数,将被除数赋值给第一个变量,余数赋值给第二个变量;
4.当余数等于0的时候,那个被除数(可能是上一个余数)就是最大公因数。
  • 运行时间
O(log N)
  • 算法实现
unsigned int Gcd(unsigned int M,unsigned int N)
{
	unsigned int Rem = 0;
	while (N>0)
	{
		Rem = M%N;
		M = N;
		N = Rem;
	}
	return M;
}




幂运算

  • 算法思想
基本思想:
使用递归思想,将整数的幂运算逐步分解,将指数按照奇数还是偶数每次除2,最终递归的基本情况,依次输出。

算法步骤:
1.处理基本情况,指数为0返回1,指数为1返回本身;
2.当指数为偶数时,递归调用函数本身,幂自乘作为新的参数,指数除以2作为新的参数;
3.当指数为奇数时,递归调用函数本身,幂自乘作为新的参数,指数除以2作为新的参数,然后再将结果乘以幂本身。
  • 运行时间
O(log N)
  • 算法实现
int IsEven(unsigned int N)
{
	if (N % 2 == 1)
		return 0;
	else
		return 1;
}


long int Pow(long int X,unsigned int N)
{
	if (N == 0)
		return 1;
	if (N == 1)
		return X;
	if (IsEven(N))
		return Pow(X*X, N / 2);
	else
		return Pow(X*X, N / 2)*X;
}
算法改进1:去掉N=1的情况,因为这种情况在N为基数的时候已经包括。
int IsEven(unsigned int N)
{
	if (N % 2 == 1)
		return 0;
	else
		return 1;
}

long int Pow(long int X, unsigned int N)
{
	if (N == 0)
		return 1;
	if (IsEven(N))
		return Pow(X*X, N / 2);
	else
		return Pow(X*X, N / 2)*X;
}
算法改进2:将最后一行进行改进,结果和运行时间保持不变。
int IsEven(unsigned int N)
{
	if (N % 2 == 1)
		return 0;
	else
		return 1;
}

long int Pow(long int X, unsigned int N)
{
	if (N == 0)
		return 1;
	if (IsEven(N))
		return Pow(X*X, N / 2);
	else
		return Pow(X, N-1)*X;
}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值