C实现查找最大子数组

如果知道一些股票的操作方式的你,要想获得最大收益,肯定是想着在股价最低时买入,在最高时卖出,可达到最大收益,但是有时候会出现股价整体下跌,其中只会出现微微上升与下降的波动,如图:


图1.示例图

最低在最高的后面,也许你会认为从第7天买了后,在11天卖出后,会达到最大收益,其实不是,通过上图的原始数据我们可以得到一个后一天相对前一天的变化量,即:Price(n)-Price(n-1).同时也是股价的变化,可当作相邻两天股票收益,可为正(盈利),也可为负(亏损).

实现的该思路算法源程序如下:

#include <stdio.h>

#include<stdlib.h>

#define NEGA_INFINIT -999999;

/***************************************

*

*function find_max_crossing_subarray()

*

* args:

*

* A inttype array

* low the lower index of A

* mid the middle index of A

* high the higher index of A

*

* return

* *max_suba

*

****************************************/

int * find_max_crossing_subarray(int A[],int low,int mid,int high){

    int i,j,sum;

    int left_sum,right_sum;

    int max_left,max_right;

    int *max_suba;

    max_suba=(int*)malloc(sizeof(int *)*3);

    left_sum=NEGA_INFINIT;

    sum=0;

    //index decrease from mid to low of left A subarray

    for(i=mid;i>=low;i--){

        sum=sum+A[i];

        if(sum>left_sum){

            left_sum=sum;

            max_left=i;

            max_suba[0]=max_left;

        }

    }

    right_sum=NEGA_INFINIT;

    sum=0;

    //index from mid+1 to high of right A subarray

    for(j=mid+1;j<=high;j++){

        sum=sum+A[j];

        if(sum>right_sum){

            right_sum=sum;

            max_right=j;

            max_suba[1]=max_right;

        }

    }

    max_suba[2]=(left_sum+right_sum);

    return max_suba;

}

/**********************************

*

* function find_maximum_subarray()

*

* args

* A[] inttype array

* low inttype the lower index of A

* hihg inttype the high index of A

*

* return (int*) pointer

* *pl

* *pr

* *pc

* *max_suba

*

*************************************/

int * find_maximum_subarray(int A[],int low,int high){

    int mid;

    int left_sum;

    int right_sum;

    int cross_sum;

    int *pl,*pr,*pc;

    int *max_suba;

    pl=(int*)malloc(sizeof(int*)*3);

    pr=(int*)malloc(sizeof(int*)*3);

    pc=(int*)malloc(sizeof(int*)*3);

    max_suba=(int*)malloc(sizeof(int*)*3);

    if(high==low){

        max_suba[0]=low;

        max_suba[1]=high;

        max_suba[2]=A[low];

        return max_suba;

    }

    else {

        mid=(low+high)/2;

        //left subarray of A

        pl=find_maximum_subarray(A,low,mid);

        left_sum=*(pl+2);

        //right subarray of A

        pr=find_maximum_subarray(A,mid+1,high);

        right_sum=*(pr+2);

        //crossing mid subarray of A

        pc=find_max_crossing_subarray(A,low,mid,high);

        cross_sum=*(pc+2);

        //left subarray of A

        if((left_sum>=right_sum)&&(left_sum>=cross_sum))

            return pl;

        else if((right_sum>=left_sum)&&(right_sum>=cross_sum))

            return pr;

        else

            return pc;

    }

}

int main()

{

    int A[16];

    int low=0,high=0;

    int *max_suba;

    char c;

    while (1) {

        scanf("%d",&A[high]);

        c=getchar();

        if(c=='\n')

            break;

        high++;

    }

    //use find_maximum_subarray()

    max_suba=find_maximum_subarray(A,low,high);

    printf("low: %d high: %d sum: %d\n",*max_suba,*(max_suba+1),*(max_suba+2));

    return 0;

}

/************************************************************

*

* input 13 -3 -25 20 -3 -16 -23 18 20 -7  12 -5 -22 15 -4 7

*

* output 18 20 -7 12 =======> low: 7 high: 10 sum: 43

*

*************************************************************/

以上便是最大数组查找的算法,其中输出: low 字数组低位下标,high 字数组高位下标,sum=(max_subarr[low,high]);

运行结果截图如下:


图2.运行结果

欢迎感兴趣的朋友一起交流,一起进步.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • 问题简介   本文将介绍计算机算法中的经典问题——最大子数组问题(maximum subarray problem...
    山阴少年阅读 3,326评论 0 2
  • 问题描述 一个只包含正负数的数组,求出连续元素之和最大的子数组。 解决1:暴力求解方法 尝试每个元素的组合,最终选...
    安静1337阅读 787评论 0 50
  • 算法 函数的增长 渐近记号 用来描述算法渐近运行时间的记号,根据定义域为自然数集的函数来定义。这样的记号对描述最坏...
    曹元_阅读 624评论 0 2
  • 设原始数据规模为n,需要采样的数量为k 先选取数据流中的前k个元素,保存在集合A中; 从第j(k + 1 <= j...
    Impossible安徒生阅读 292评论 0 0
  • 描述 给定一个整数数组,找出两个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。返回最大...
    6默默Welsh阅读 412评论 0 0