如何使用合并排序 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;
}
我编写了一个方法,使用合并排序将列表从最小到最大排序。在这种情况下,我希望此合并排序方法 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;
}