合并排序应用程序

时间:2011-06-15 08:24:58

标签: java algorithm recursion mergesort

我正在做一个给定N个值数组的练习,我需要得到两个数字,它们的减法(最高 - 最低)是最正数。我希望v大于c ...情况是......假设我想以价格C购买拍卖,所以我可以以V价出售它们并获得最大利润,并且阵列的每个单元都是在第t天拍卖的价格,所以我想以尽可能低的价格购买,所以我可以以尽可能高的价格出售,所以C必须出现在阵列中的V之前。例如:

n = 8
arr = {6,7,3,8,9,2,1,4,20}

我想要c = 1v = 20,因为20 - 1 = 19(这意味着从这两个数字中减去最高)

另一个例子:

n = 6
arr = {8,12,45,40,18,29}

我想要c = 8v = 45,因为它们的减法是所有其他减法中的最高数。 (我想澄清一下c并不总是数组中最小的数字)。两个数字不需要彼此相邻。如果我有n = 1, {1},那么c = 1v = 1

此示例演示c和v并不总是最低/最高值。

n = 6
arr = {19,27,5,6,7,8}

在这种情况下c = 19v = 27

另外,我需要使用合并排序的代码来解决这个问题(示例将它分为两​​种方法: mergesort 处理递归, merge 执行更改使用辅助阵列的位置。)

我正在使用mergesort代码(在我看来合并是不必要的,因为我不关心排序),到目前为止我有以下代码,但显然是错误的,有人可以告诉我我不做什么正确?

public static void mergeSort(int start, int end) {
    if(start < end) {
        int half = (start + end) / 2;
        mergeSort(start, half);
        for(int i = start; start < half; start++, i++){
            if((arr[i+1] - arr[i]) > temp){
                temp = arr[i+1] - arr[i];
                c = i;
                v = i+1;
            }
        }
        mergeSort(half+1, end);
        for(int i = half+1; i < end; half++, i++){
            if((arr[i+1] - arr[i]) > temp){
                temp = arr[i+1] - arr[i];
                c = i;
                v = i+1;
            }
        }
    }
}

提前感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

我猜您代码中的名称mergeSort是继承的....

由于您已经进行了递归,因此无需遍历所有元素,因为递归之后,结果已经显示。例如,一种可能的方法是将最小值交换到第一个位置,将最大值交换到最后一个位置,然后,在“递增”的“上”级别,您可以直接检索它们。


这是另一种利用merge-sort理念的解决方案,但只有返回最大值

public class test {
    static int arr [] = {6,7,3,8,9,2,1,4,20};

    public static void main (String args[]) {
        System.out.println(merge_select_max(0, arr.length - 1));
    }

    public static int merge_select_max (int start, int end) { // both inclusive
        if (start == end) {
            return arr[start];          
        }
        else {
            int half = (start + end) / 2;
            int first = merge_select_max (start, half);
            int second = merge_select_max (half + 1, end);
            return (first > second ? first : second);           
        }       
    }
}