栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现一些算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现一些算法

我太菜了,我是辣鸡,完全不会写c++的递归,我目前用的求子序列的和函数必须要return啊。但是吧变量定义成static返回数组,感觉会出问题。先学吧,以后再来整

  1. 利用分治算法求解一个序列的最大子序列
    分治算法有三步(第三步忘记了,明天补充):
    分解:
    合并:

还有好多语法不会,明天再写吧
现在报错1fenzhi.cpp:(.text+0x1b3): undefined reference to `CSuanFa::GetMaxSubList(double*, int*, int, int)’
collect2: error: ld returned 1 exit status
明天研究:笨比自己,发现原因,c++类方法定义是ClassName::FuncName,昨天没写ClassName::导致报错。

#include 
#include 

using namespace std;

class CSuanFa
{
public:
    double FatherList[9]; //后面用构造函数给他赋值
    //以下所有函数应该返回数组的
    int *GetMaxSubList(double FatherList[9], int iStart, int iEnd);
    int *GetCrossMaxSub(double FatherList[9], int iLeftIdx, int iRightIdx, int iMid);
};

int *CSuanFa::GetMaxSubList(double FatherList[9], int iLeftIdx, int iRightIdx)
{
    static int res[3] = {0, 0, 0};
    if (iLeftIdx == iRightIdx)
    {
        *res = iLeftIdx;
        *(res + 1) = iRightIdx;
        *(res + 2) = *(FatherList + iLeftIdx);
        return res;
    }
    //下面递归
    //获取左边最大子序列
    int iMid = int((iLeftIdx + iRightIdx) / 2);
    int *leftMax = this->GetMaxSubList(FatherList, iLeftIdx, iMid);
    //获取右边最大子序列
    int *rightMax = this->GetMaxSubList(FatherList, iMid + 1, iRightIdx);
    //获取包含中点的最大子序列
    int *crossMax = this->GetCrossMaxSub(FatherList, iLeftIdx, iRightIdx, iMid);
    //返回三个子序列中和最大的
    if (*(leftMax + 2) > *(rightMax + 2))
    {
        if (*(leftMax + 2) > *(crossMax + 2))
        {
            return leftMax;
        }
        else
        {
            return crossMax;
        }
    }
    else
    {
        if (*(rightMax + 2) > *(crossMax + 2))
        {
            return rightMax;
        }
        else
        {
            return crossMax;
        }
    }
}

int *CSuanFa::GetCrossMaxSub(double FatherList[9], int iLeftIdx, int iRightIdx, int iMid)
{
    int iTotalSum = INT_MIN;
    int iLeftSum = 0;
    int iResLeftIdx = 0;
    int iResRightIdx = 0;
    for (int i = iMid; i >= iLeftIdx; i--)
    {
        iLeftSum = iLeftSum + *(FatherList + i);
        if (iLeftSum >= iTotalSum)
        {
            iTotalSum = iLeftSum;
            iResLeftIdx = i;
        }
    }
    int iRightSum = 0;

    for (int i = iMid + 1; i <= iRightIdx; i++)
    {
        iRightSum = iRightSum + *(FatherList + i);
        if (iRightSum + iTotalSum >= iTotalSum)
        {
            iTotalSum = iLeftSum;
            iResRightIdx = i;
        }
    }
    static int res[3] = {iResLeftIdx,
                         iResRightIdx,
                         iTotalSum};
    return res;
}

int main()
{
    double FatherList[9] = {1, 4, -3, 7, -9, 4, 8, 1, -7};
    CSuanFa oSuanfa;
    int *result = oSuanfa.GetMaxSubList(FatherList, 0, 8);
    for (int i = 0; i < 3; i++)
    {
        cout << "The result is:" << *(result + i) << endl;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509914.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号