MergeSort 不会修改我传递到方法中的数组

问题描述 投票:0回答:1
class Result {
    public static int activityNotifications(List<Integer> expenditure, int d) {
        int notices = 0;
        int len = expenditure.size();
        for(int i = d; i < len; i++){
            int[] clone = new int[d];

            for(int j = 0; j < d; j++){
                clone[j] = expenditure.get(i - d + j);
            }

            MergeSort.mergeSort(clone, 0, d - 1);
            double median;
            if (d % 2 == 0){
                median = (clone[d/2] + clone[d/2 + 1]) / 2.0;
            } else{
                median = clone[d / 2];
            }
            if(expenditure.get(i) >= median * 2){
                notices++;
            }
        }
        return notices;
    }
}

class MergeSort{
    public static void mergeSort(int[] arr, int l, int h){
        if (l < h){
            int mid  = (l + h) / 2;
            mergeSort(arr, l ,mid);
            mergeSort(arr, mid + 1 , h);
            merge(arr, l, mid, h);
        }
    }

    public static void merge(int[] arr, int l, int mid, int h){
        int n1 = mid - l + 1;
        int n2 = h - mid;

        int[] L = new int[n1];
        int[] R = new int[n2];

        for (int p = 0; p < n1; p++){
            L[p] = arr[p + l];
        }

        for (int p = 0; p < n2; p++){
            R[p] = arr[p + mid + 1];
        }

        int k = l;
        int i = 0;
        int j = 0;

        while (i < n1 && j < n2){
            if (arr[i] <= arr[j]){
                arr[k] = L[i];
                i++;
                k++;
            }
            else {
                arr[k] = R[j];
                j++;
                k++;
            }

            while(i < n1){
                arr[k] = L[i];
                i++;
                k++;
            }

            while(j < n2){
                arr[k] = R[j];
                j++;
                k++;
            }
        }
    }  
}


public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");

        int n = Integer.parseInt(firstMultipleInput[0]);

        int d = Integer.parseInt(firstMultipleInput[1]);

        List<Integer> expenditure = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
            .map(Integer::parseInt)
            .collect(toList());

        int result = Result.activityNotifications(expenditure, d);

        bufferedWriter.write(String.valueOf(result));
        bufferedWriter.newLine();

        bufferedReader.close();
        bufferedWriter.close();
    }
}

这是代码。基本上,当我创建 MergeSort.java 文件,然后创建该类的实例并使用静态 mergeSort 方法对数组进行排序时,一切都在我的 IDE 上运行良好。 但是当我在这个只允许一个文件的编码网站上运行它时,我将 MergeSort 类压缩到同一个文件中。现在我意识到,传递给该方法的数组没有进行任何实际更改。请问我可以知道为什么吗?

我尝试了不同的方法,但无法进行排序。

java class mergesort
1个回答
0
投票

while
方法中的2个
merge
循环应位于外部
while
循环体之外:

    public static void merge(int[] arr, int l, int mid, int h) {
        int n1 = mid - l + 1;
        int n2 = h - mid;

        int[] L = new int[n1];
        int[] R = new int[n2];

        for (int p = 0; p < n1; p++) {
            L[p] = arr[p + l];
        }

        for (int p = 0; p < n2; p++) {
            R[p] = arr[p + mid + 1];
        }

        int k = l;
        int i = 0;
        int j = 0;

        while (i < n1 && j < n2) {
            if (arr[i] <= arr[j]) {
                arr[k] = L[i];
                i++;
                k++;
            } else {
                arr[k] = R[j];
                j++;
                k++;
            }
        }
        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }
        while (j < n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }  
}
© www.soinside.com 2019 - 2024. All rights reserved.