zoukankan      html  css  js  c++  java
  • 查找数组中最大子数组C语言实现

          一个数组,查找这个数组中最大的一个连续子数组。比如{1, 2, 3, –11},这个数组中最大子数组为{1, 2, 3}。

         算法复杂度: O(nlgn)

          伪代码:

    image

    image

          C代码:

    #include <stdio.h>
    
    typedef struct index {
    	int left;
    	int right;
    	int sum;
    } index_t;
    
    index_t find_max_crossing_subarray(int* a, int low, int mid, int high)
    {
    	int left_sum = 0x80000000;
    	int right_sum = 0x80000000;
    	int sum = 0;
    	int max_left, max_right;
    
    	int i;
    
    	index_t value;
    
    	for (i = mid; i >= low; i--) {
    		sum += a[i];
    		if (sum > left_sum) {
    			left_sum = sum;
    			max_left = i;
    		}
    	}
    
    	sum = 0;
    	for (i = mid + 1; i <= high; i++) {
    		sum += a[i];
    		if (sum > right_sum) {
    			right_sum = sum;
    			max_right = i;
    		}
    	}
    
    	value.left = max_left;
    	value.right = max_right;
    	value.sum = left_sum + right_sum;
    
    	return value;
    }
    
    index_t find_maximum_subarray(int *a, int low, int high)
    {
    	index_t left_value, right_value, value;
    	int mid;
    
    	if (high == low) {
    		value.left = low;
    		value.right = high;
    		value.sum = a[low];
    		return value;
    	} else {
    		mid = (high + low)/2;
    		left_value = find_maximum_subarray(a, low, mid);
    		right_value = find_maximum_subarray(a, mid + 1, high);
    		value = find_max_crossing_subarray(a, low, mid, high);
    
    		if (left_value.sum >= right_value.sum && left_value.sum >= value.sum)
    			return left_value;
    		else if (right_value.sum >= left_value.sum && right_value.sum >= value.sum)
    			return right_value;
    		else 
    			return value;
    	}
    }
    
    int main()
    {
    	int a[] = {3, 8, -1, -6, 12, 34, -43, 28};
    
    	index_t value;
    
    	value = find_maximum_subarray(a, 0, 7);
    
    	printf("The maximum subarray is from %d to %d, sum is %d\n", value.left, value.right, value.sum);
    
    	return 0;
    }
  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/wangshuo/p/2163526.html
Copyright © 2011-2022 走看看