算法导论书,page41,最大子数组,java代码实现

来源:互联网 发布:克克mp3录音软件 编辑:程序博客网 时间:2024/05/16 19:31

代码的详细解释可以参考书。注意findMaxCrossingSubarray函数,findMaximumSubArray函数返回的是一个对象,所以我们得提前定义一个SubArray 对象,考虑到封装性,将其成员变量设置为私有,并且添加有参构造函数,以及set,get方法。

public class SubArray {


    private int low;
    private int high;
    private int sum;
  
    
    
    public SubArray(int low, int high, int sum) {  
        super();  
        this.low = low;  
        this.high = high;  
        this.sum = sum;  
    }


public int getHigh() {
return high;
}


public void setHigh(int high) {
this.high = high;
}


public int getLow() {
return low;
}


public void setLow(int low) {
this.low = low;
}


public int getSum() {
return sum;
}


public void setSum(int sum) {
this.sum = sum;
}  

}

而后2个函数就是书上的伪代码,注意maxLeft变量和maxRight变量用之前要初始化

下面是完整代码

import java.util.Arrays;




public class FindMaximumSubArray {


public static SubArray findMaxCrossingSubarray(int[] arr,int low,int mid,int high){
int leftSum = Integer.MIN_VALUE;
int sum = 0;
int maxLeft = 0;//
for(int i = mid;i >= 0;i--){
sum += arr[i];
if(sum > leftSum){
leftSum = sum;
maxLeft = i;
}
}
int rightSum = Integer.MIN_VALUE;
int maxRight = 0;//
sum = 0;
for(int j = mid + 1;j <= high;j++){
sum += arr[j];
if(sum > rightSum){
rightSum = sum;
maxRight = j;
}
}
return new SubArray(maxLeft,maxRight,leftSum + rightSum);
}

public static SubArray findMaximumSubArray(int[] array, int low, int high) {  
        if (low == high) {  
            return new SubArray(low, high, array[low]);  
        } else {  
            int mid = (low + high) / 2;  
            SubArray subArrayLeft = findMaximumSubArray(array, low, mid);  
            SubArray subArrayRight = findMaximumSubArray(array, mid + 1, high);  
            SubArray subArrayCross = findMaxCrossingSubarray(array, low, mid, high);  
  
            if (subArrayLeft.getSum() > subArrayRight.getSum() && subArrayLeft.getSum() > subArrayCross.getSum()) {  
                return subArrayLeft;  
            } else if (subArrayRight.getSum() > subArrayLeft.getSum() && subArrayRight.getSum() > subArrayCross.getSum()) {  
                return subArrayRight;  
            } else {  
                return subArrayCross;  
            }  
        }  
    }  

public static void main(String[] args) {
int[] array = { 8,-5,6,17,29,-36  };

SubArray subArray = findMaximumSubArray(array, 0, array.length - 1);
for(int i = subArray.getLow();i <= subArray.getHigh();i++){
System.out.print(array[i] + " ");
}
}
}

欢迎指证

0 0
原创粉丝点击