您的位置:首页 > 其它

分治法求最大子数组问题

2016-09-11 20:14 190 查看
1.思想:将数组分治为三部分来进行求解:以中间为划分,最大字数组可能在左半部分,也可能在右半部分,也可能跨越中间。

2.参考算法导论,实现用java代码:

public class FenzhiArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr={-6,4,-3,2,5,-6,9,-8};
max(arr,0,arr.length/2,arr.length-1);
}
static void max(int []arr, int low, int mid, int high) {  
   int sum = 0;  
   //左侧的最大值为中间的数
   int left_sum = arr[mid];  
   //求和的数
   sum = 0;
   int left_index=0;
   //从中间往两边走
   for (int i = mid; i >= low; i--) {  
       sum += arr[i];  
       if (sum > left_sum)  
           {left_sum = sum;
       
left_index=i;}
   }  
 //求右侧的最大
   int right_index=0;
   int right_sum = arr[mid + 1];  
   sum = 0;  
   for (int j= mid + 1; j<= high; j++) {  
       sum += arr[j];  
       if (sum > right_sum)  
           {right_sum = sum;
       
right_index=j;}
   }  
   System.out.println("左边的索引为"+left_index);
   System.out.println("左边的索引为"+right_index);
 System.out.println("最大值为:"+(left_sum+right_sum));
  printArr(arr,left_index,right_index);
}
//为了打印数组的元素
static void printArr(int []arr,int startIndex, int endIndex)

    {

        for (int i = startIndex; i <= endInd
4000
ex; i++)

        {

            System.out.print(arr[i] + " ");

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: