对分查找
- 算法思想
基本思想:
首先该数组必须是已经排序的数组,验证查找的数是否是居中的元素,如果是,则答案就找到了。如果该数小于中间的元素,则用同样的策略在居中元素的左边的序列继续查找;如果该数大于中间的元素,则用同样的策略在居中元素的右侧继续查找。最后如果找到则返回数组中元素的序号,否则查找完没有找到就终止查找。
算法步骤:
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;
}
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;
}
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;
}