编程语言
首页 > 编程语言> > 数据结构与算法学习记录——几个简单的算法

数据结构与算法学习记录——几个简单的算法

作者:互联网

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