数据结构与算法学习记录——几个简单的算法
作者:互联网
1、最大子序列和
暴力破解
int MaxSubsequenceSum(const int A[],int N){
int ThisSum,MaxSum,i,j,k;
MaxSum = 0;
for( i = 0,i < N,i++ ){//对整个数组进行遍历
for( j = i; j < N; j++ ){//确定子序列
ThisSum = 0;//记录当前子序列的和
for( k = j; k <= j; k++){
ThisSum += A[k]; //进行求和
if(ThisSum > MaxSum){
MaxSum = ThisSum; //更新最大子序列和
}
}
}
}
return MaxSum;
}
时间复杂度O(N^3)
从上面的算法中可以看出,中间的两个循环可以省略,直接在遍历整个序列中就进行求和,然后不断比较每次求和的大小。
优化
int MaxSubsequenceSum(const int A[],int N) {
int ThisSum,MaxSum,i;
ThisSum = MaxSum = 0;
for( i = 0; i < N; i++) {
//遍历序列的时候就开始相加
ThisSum += A[i];
if(ThisSum > MaxSum) {
MaxSum = ThisSum;
}
else if(ThisSum < 0) {
/*
如果当前的和0,说明序列中存在负数,且负数的和大于正数
此时就让ThisSum等于0,不考虑之前负数的子序列,从下一位开始
*/
ThisSum = 0;
}
//如果ThisSum < MaxSum不做处理,继续加下一位
return MaxSum;
}
}
时间复杂度O(N)
2、对分查找
int BinarySerch(const int A[],int X,int N ) {
int low,high,mid;
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 -1;
}
}
3、欧几里得算法
欧几里得算法是用来求最大公因数
最大公因数:同时能够整除二者的最大整数
unsigned int Gcd(unsigned int M,unsigned int N) {
unsigned int Rem;
while( N > 0 ){
//两个数不断进行取余
Rem = M % N;
M = N;
N = Rem;
}
return M;
}
如果M>N 则 M mod N < M/2
标签:return,记录,int,mid,算法,序列,ThisSum,数据结构,MaxSum 来源: https://blog.csdn.net/weixin_43900407/article/details/112694131