資料結構 一 4種方法求最大子列和

2021-08-21 16:34:23 字數 2255 閱讀 3770

/*

功能:求最大子列和

日期:2018/7/23

*/#include

#include

#define n 1000

int maxsubsesum(int a, int n);

void main()

,i; for (i = 0; i < n; i++)

a[i] = rand() % 10000;

printf("maxsubsesum=%d\n", maxsubsesum(a, n));

system("pause");

}int maxsubsesum(int a,int n)}}

return maxsum;

}

因為有3重for迴圈,因此時間複雜度為:t(n)=o(n^3),時間複雜度太大,不理想,下面是稍微優化後的。

#include

#include

#define n 1000

int maxsubsesum(int a, int n);

void main()

, i;

for (i = 0; i < n; i++)

a[i] = rand() % 10000;

printf("maxsubsesum=%d\n", maxsubsesum(a, n));

system("pause");

}int maxsubsesum(int a, int n)

}return maxsum;

}

t(n)=o(n^2)

時間複雜度稍微好一點,但還是比較大,程式設計師一般看到時間複雜度是n^2,就會想辦法將其複雜度變為nlogn,因此出現了下面的分而治之法。

/*

功能:求最大子列和(分而治之)

*/#include

#include

#define n 1000

//求三個數的最大值

int max(int a, int b, int c)

//遍歷整個子列求最大值

int maxcross(int a, int left, int mid, int right)

//遍歷從中間到右邊

sum = 0;

for (i = mid + 1; i <= right; i++)

return leftsum + rightsum;

}//分而治之

int divideandrule(int a, int left,int right)

//求中間值

mid = (left + right) / 2;

//對左邊的子列用分而治之法

maxleft = divideandrule(a, left, mid);

//對右邊的子列用分而治之法

maxright = divideandrule(a, mid + 1, right);

//遍歷整個子列

maxmiddle = maxcross(a,left,mid,right);

return max(maxleft, maxright, maxmiddle);

}void main()

, i;

for (i = 0; i < n; i++)

a[i] = rand() % 10000;

printf("divideandrule=%d\n", divideandrule(a, 0, n - 1));

system("pause");

}

/*

*/#include

#include

#define n 1000

void main()

, i;

for (i = 0; i < n; i++)

a[i] = rand() % 10000;

printf("onlineprocess=%d\n", onlineprocess(a,n));

system("pause");

}int onlineprocess(int a, int n)

return maxsum;

}

———————————————————————————-2018.7.23以上是我今天整理的資料結構的一點小小的筆記,以後還會繼續更新^-^

資料結構 求最大子列和

陳越姥姥已經講得很好了 傳送門,我只做記錄方便回顧。四種演算法 1.暴力,演算法複雜度 o n 3 2.暴力,演算法複雜度 o n 2 3.分治法 遞迴 演算法複雜度 o nlogn 4.及時處理,演算法複雜度 o n includeint a 100000 int whoismax int i,i...

最大子列和(C語言 4種方法)

主函式 呼叫不同的函式,更改這句就ok max maxsubseqsum4 a,n int main return maxsum int maxsubseqsum2 int a,int n return maxsum int max int a,int b,int c int divideandco...

求最大子列和的四種方法

includeint maxsubseqsum2 int a,int n return maxsum int main int i,n scanf d n for i 0 i int max3 int a,int b,int c int divideandconquer int list,int l...