C_求最大连续子序列和
题目:
输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:
序列:-2 11 -4 13 -5 -2,则最大子序列和为20。
序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。
1.
1 /* 2 算法一:穷举法(3个for) 3 时间复杂度:O(n^3) 4 5 */ 6 #include <stdio.h> 7 #include <malloc.h> 8 9 int Max = 0; 10 int find_max(int len, int arr[]){ 11 int i, j, k, sum; 12 for(i=0; i<len; i++){ 13 for(j=i; j<len; j++){ 14 sum = 0; 15 for(k=i; k<=j; k++){ 16 sum += arr[k]; 17 } 18 if(sum > Max){ 19 Max = sum; 20 } 21 } 22 } 23 return Max; 24 25 } 26 27 int main(){ 28 int i, len, *arr; 29 printf("请输入数组的长度: "); 30 scanf("%d",&len); 31 arr = (int *)malloc(sizeof(int)*len); 32 printf("请输入数组的值:"); 33 for(i=0; i<len; i++){ 34 scanf("%d",&arr[i]); 35 } 36 find_max(len,arr); 37 printf("最大连续子序列和 :%d\n", Max ); 38 39 return 0; 40 }
2.
1 /* 2 算法二:算法一的优化 (2个for) 3 时间复杂度:O(n^2) 4 */ 5 #include <stdio.h> 6 #include <malloc.h> 7 8 int Max = 0; 9 int find_max(int arr[],int n, int len){ 10 int i, sum = 0; 11 for(i=n; i<len; i++){ 12 sum += arr[i]; 13 if(sum > Max){ 14 Max = sum ; 15 } 16 } 17 return Max; 18 } 19 20 int main(){ 21 int i, len, *arr; 22 printf("请输入数组的长度:"); 23 scanf("%d",&len); 24 arr = (int *)malloc(sizeof(int)*len); 25 printf("请输入数组的值:"); 26 for (i=0; i<len; i++) 27 { 28 scanf("%d", &arr[i]); 29 } 30 31 32 for(i=0; i<10; i++){ 33 find_max(arr,i, len); 34 } 35 36 printf("最大连续子序列和:%d \n",Max); 37 38 return 0; 39 }
将代码进行以下修改,可以得到该最大子序列和的开始元素和结束元素(low,high)
1 int find_max(int len, int arr[]){ 2 int i, j, sum, low, high; 3 for(i=0; i<len; i++){ 4 sum = 0; 5 for(j=i; j<len; j++){ 6 sum += arr[j]; 7 if(sum > Max){ 8 Max = sum; 9 low = i; 10 high = j; 11 } 12 } 13 } 14 printf("The low is :%d\nThe high is : %d\n",arr[low],arr[high]); 15 return Max; 16 }
3.
1 /* 2 算法三:联机算法 3 时间复杂度:O(n) 4 */ 5 #include <stdio.h> 6 #include <malloc.h> 7 8 int Max = 0; 9 int find_max(int len, int arr[]) 10 { 11 int i, sum = 0; 12 for(i=0; i<len; i++) 13 { 14 sum += arr[i]; 15 if(sum > Max) 16 { 17 Max = sum; 18 }else if(sum < 0){ 19 sum = 0; 20 } 21 } 22 23 return Max; 24 } 25 26 int main(){ 27 int i, len, *arr; 28 printf("请输入数组的长度:"); 29 scanf("%d",&len); 30 arr = (int *)malloc(sizeof(int)*len); 31 printf("请输入数组的值:"); 32 for (i=0; i<len; i++) 33 { 34 scanf("%d", &arr[i]); 35 } 36 find_max(len, arr); 37 printf("最大连续子序列和:%d \n",Max); 38 return 0; 39 }
对以上代码进行小的改动,通过生成一系列的随机数进行测试程序运行的时间,由于程序运行的很快,需要通过重复循环取平均值的方法得到程序执行一次的时间。参考:http://www.cnblogs.com/LinSL/p/7475001.html
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 #include <time.h> 5 6 clock_t start,stop; 7 double duration; 8 9 void fun(int len,int arr[]); 10 11 int main(){ 12 int len, *arr, i; 13 printf("Please enter the len:"); 14 scanf("%d",&len); 15 arr = (int*)malloc(sizeof(int)*len);17 for(i=0; i<len; i++){ 16 arr[i] = rand()%2001-1000;/*产生-1000~1000之间的随机数*/ 17 printf("%d ",arr[i]); 18 } 19 printf("\n"); 20 start = clock(); 21 fun(len,arr); 22 stop = clock(); 23 duration = ((double)(stop - start))/CLK_TCK; 24 printf("The duration is:%f\n",duration);/*0.0000*/ 25 return 0; 26 } 27 28 void fun(int len,int arr[]){ 29 int max=0, 30 sum=0, 31 i; 32 for(i=0; i<len; i++){ 33 sum += arr[i]; 34 if(sum > max){ 35 max = sum; 36 }else if(sum < 0){ 37 sum = 0; 38 } 39 } 40 printf("The max_sum is:%d\n",max); 41 }
参考:http://blog.163.com/kevinlee_2010/blog/static/169820820201010495438247/