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

来源:互联网 发布:金钥匙软件怎么使用 编辑:程序博客网 时间:2024/06/05 02:08

对分查找

  • 算法思想
基本思想:
首先该数组必须是已经排序的数组,验证查找的数是否是居中的元素,如果是,则答案就找到了。如果该数小于中间的元素,则用同样的策略在居中元素的左边的序列继续查找;如果该数大于中间的元素,则用同样的策略在居中元素的右侧继续查找。最后如果找到则返回数组中元素的序号,否则查找完没有找到就终止查找。
算法步骤:
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;elseif (A[Mid] > X)High = Mid - 1;elsereturn 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;elsereturn 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);elsereturn Pow(X*X, N / 2)*X;}
算法改进1:去掉N=1的情况,因为这种情况在N为基数的时候已经包括。
int IsEven(unsigned int N){if (N % 2 == 1)return 0;elsereturn 1;}long int Pow(long int X, unsigned int N){if (N == 0)return 1;if (IsEven(N))return Pow(X*X, N / 2);elsereturn Pow(X*X, N / 2)*X;}
算法改进2:将最后一行进行改进,结果和运行时间保持不变。
int IsEven(unsigned int N){if (N % 2 == 1)return 0;elsereturn 1;}long int Pow(long int X, unsigned int N){if (N == 0)return 1;if (IsEven(N))return Pow(X*X, N / 2);elsereturn Pow(X, N-1)*X;}







原创粉丝点击