好的,我知道这个问题不会显示研究工作,但我已经多次查看这段代码而且我无法弄清楚我做错了。我知道有许多Mergesort实现示例,但我想按照我的方式去做。感谢任何帮助。谢谢。
import java.util.Scanner;
public class MergeSort
{
public static int[] mergeSort(int[] arr)
{
if (arr.length > 1)
{
int[] arr1 = splitLeft(arr);
int[] arr2 = splitRight(arr);
arr1 = mergeSort(arr1);
arr2 = mergeSort(arr2);
return merge(arr1, arr2);
}
else
return arr;
}
public static int[] splitLeft(int[] arr)
{
int middle = arr.length / 2;
int[] newarr = new int[middle];
for (int i = 0; i < middle; i++)
newarr[i] = arr[i];
return newarr;
}
public static int[] splitRight(int[] arr)
{
int middle = arr.length / 2;
int[] newarr = new int[arr.length - middle];
for (int i = 0; i + middle < arr.length; i++)
newarr[i] = arr[i + middle];
return newarr;
}
public static int[] merge(int[] arr1, int[] arr2)
{
int[] sorted = new int[arr1.length+arr2.length];
int i1 = 0;
int i2 = 0;
int i = 0;
while (i1 < arr1.length && i2 < arr2.length)
{
if (arr1[i1] < arr2[i2])
{
sorted[i] = arr1[i1];
i1++;
}
else
{
sorted[i] = arr2[i2];
i2++;
}
i++;
}
while (i1 < arr1.length)
{
sorted[i] = arr1[i1];
i1++;
i++;
}
while (i2 < arr2.length)
{
sorted[i] = arr1[i2];
i2++;
i++;
}
return sorted;
}
public static int getNum(int x)
{
int num = (int)(Math.random()*x + 1);
return num;
}
public static void printArr(int[] arr)
{
System.out.println();
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
static Scanner reader = new Scanner(System.in);
public static void main(String [ ] args)
{
int i;
System.out.println("Type the length of the array");
int n = reader.nextInt();
System.out.println("Type the range of the random numbers generator");
int range = reader.nextInt();
int[]arr = new int[n];
for (i = 0; i < n; i++)
arr[i] = getNum(range);
printArr(arr);
int[] sorted = new int[n];
sorted = mergeSort(arr);
printArr(sorted);
}
}
答案 0 :(得分:2)
我认为问题出在你的splitRight
函数中。请考虑以下代码:
for (int i = middle; i < arr.length; i++)
newarr[i] = arr[i];
这会尝试将i
元素从arr
复制到i
的{{1}}位置,但这是不正确的。例如,如果数组newarr
包含十个元素,则您希望将arr
的元素5复制到arr
的位置0,将newArr
的元素6复制到{的位置1 {1}}等等。
要解决此问题,请考虑尝试以下方法:
arr
希望这有帮助!
答案 1 :(得分:0)
当你这样做时
for (int i = middle; i < arr.length; i++)
newarr[i] = arr[i];
你肯定会在原始数组中询问位置,同时在新数组中寻找它们(这恰好更短)。