如何使用合并排序 return 数组中第一项和最后一项的差异?

How to return difference of 1st and last item in array using merge sort?

我编写了一个方法,使用合并排序将列表从最小到最大排序。在这种情况下,我希望此合并排序方法 return 列表中第一项与最后一项之间的数值差异,而不是 returning 列表。到目前为止,我的代码如下。

public static int mergeSort(int[] nums)  {
     if(nums.length > 1)    {
        int elementsInA1 = nums.length/2;
        int elementsInA2 = nums.length - elementsInA1;
        int arr1[] = new int[elementsInA1];
        int arr2[] = new int[elementsInA2];

        for(int i = 0; i < elementsInA1; i++)
            arr1[i] = nums[i];

        for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
            arr2[i - elementsInA1] = nums[i];

        arr1 = mergeSort(arr1);
        arr2 = mergeSort(arr2);

        int i = 0, j = 0, k = 0;

        while(arr1.length != j && arr2.length != k) {
            if(arr1[j] <= arr2[k]) {
                nums[i] = arr1[j];
                i++;
                j++;
            } else {
                nums[i] = arr2[k];
                i++;
                k++;
            }
        }

        while(arr1.length != j) {
            nums[i] = arr1[j];
            i++;
            j++;
        }
        while(arr2.length != k) {
            nums[i] = arr2[k];
            i++;
            k++;
        }
    }
    int max = nums[nums.length - 1];
    int min = nums[0];

    int maxDifference = max - min;
    return maxDifference; 
 }

但是此代码不起作用,因为在下面的命令中,您不能将 int[] 转换为 int。

arr1 = mergeSort(arr1);

arr2 = mergeSort(arr2);

我的问题是,有没有办法修改此方法,使其使用合并排序对元素进行排序,然后 returns 数组中第一项和最后一项之间的差异,而无需写另一个方法?还是我在做梦?

你已经知道了——你只是不知道。

arr1 = mergeSort(arr1); 更改为 mergeSort(arr1);
arr2 = mergeSort(arr1); 更改为 mergeSort(arr2);

数组[已经]被修改"in place"。

以下是您的代码,其中包含更改和一些注释[请原谅无偿样式清理]:

// mergeSort -- do merge sort
public static int
mergeSort(int[] nums)
{
    if (nums.length > 1) {
        int elementsInA1 = nums.length/2;
        int elementsInA2 = nums.length - elementsInA1;
        int arr1[] = new int[elementsInA1];
        int arr2[] = new int[elementsInA2];

        for (int i = 0; i < elementsInA1; i++)
            arr1[i] = nums[i];

        for (int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
            arr2[i - elementsInA1] = nums[i];

        // NOTE: these calls will modify arr1 and arr2 respectively
        mergeSort(arr1);
        mergeSort(arr2);

        int i = 0, j = 0, k = 0;

        // NOTE: this is modifying the caller's nums array
        while (arr1.length != j && arr2.length != k) {
            if (arr1[j] <= arr2[k]) {
                nums[i] = arr1[j];
                i++;
                j++;
            }
            else {
                nums[i] = arr2[k];
                i++;
                k++;
            }
        }

        while (arr1.length != j) {
            nums[i] = arr1[j];
            i++;
            j++;
        }
        while (arr2.length != k) {
            nums[i] = arr2[k];
            i++;
            k++;
        }
    }

    int max = nums[nums.length - 1];
    int min = nums[0];
    int maxDifference = max - min;

    return maxDifference;
}