Java 我需要帮助排除我的合并排序和合并代码故障
因此,我一直在为一个算法项目研究MergeSort,但在获取对数组进行排序的代码时,我遇到了各种问题。每当我生成一个字符串并将其放入MergeSort时,结果似乎完全一样。我需要一些帮助来找出我的代码中的错误在哪里,为什么它会给我这个,以及一个简单但很好的解释的解决方案 以下是我过去尝试过的:Java 我需要帮助排除我的合并排序和合并代码故障,java,mergesort,array-algorithms,Java,Mergesort,Array Algorithms,因此,我一直在为一个算法项目研究MergeSort,但在获取对数组进行排序的代码时,我遇到了各种问题。每当我生成一个字符串并将其放入MergeSort时,结果似乎完全一样。我需要一些帮助来找出我的代码中的错误在哪里,为什么它会给我这个,以及一个简单但很好的解释的解决方案 以下是我过去尝试过的: 我曾尝试使用returnarr[0]而不是arr,但由于无法将int转换为int[],因此出现了一个错误 我看了我的合并课,那里一切似乎都很好 我和我的老师讨论过这个问题,他说一切看起来都很好,但我知道一
arr[0]
而不是arr
,但由于无法将int
转换为int[]
,因此出现了一个错误返回合并(arr1,arr2)
,但系统抛出一个错误,告诉我必须返回一些内容private static int[] merge(int[] a, int[] b)
{
int[] c = new int[a.length + b.length];
int counterA = 0;
int counterB = 0;
int counterC = 0;
while (counterA != a.length && counterB != b.length)
{
if (a[counterA] < b[counterB])
{
c[counterC] = a[counterA];
counterA++;
counterC++;
}
else
{
c[counterC] = b[counterB];
counterB++;
counterC++;
}
}
while (counterB == b.length && counterA != a.length)
{
c[counterC] = a[counterA];
counterA++;
counterC++;
}
while (counterA == a.length && counterB != b.length)
{
c[counterC] = b[counterB];
counterB++;
counterC++;
}
return c;
}
预期结果应为:
9, 1, 7, 5, 7, 2, 2, 9, 8, 9
1, 2, 2, 5, 7, 7, 8, 9, 9, 9
然而,这是输出的结果(数组的输出没有变化):
您的代码未按编写的方式编译。在
mergeSort
中,如果数组长度等于1,则应返回arr
。经过此更改后,您的代码工作正常
但是,我们可以对您的代码进行一些小的更改,使其更干净。注意,对于merge
中的最后一个while循环,checkcounterA==a.length
将始终为true。因此,我们可以删除它。此外,可以在访问阵列时增加计数器。结合这些建议,您的merge
方法将产生以下代码:
私有静态int[]合并(int[]a,int[]b)
{
int[]c=新的int[a.length+b.length];
int计数器A=0;
int计数器b=0;
int计数器c=0;
while(counterA!=a.length&&counterB!=b.length)
{
if(a[counterA]我在代码中看到的唯一问题是返回arr[0]代码>而不是返回arr
或返回新的int[]{arr[0]}代码>在合并排序中
除此之外,代码按预期工作
如果没有看到正确的输出,则可能没有正确使用输出
下面是我如何测试它的一个示例
public static void main(String[] args) {
int[] input = new int[]{9, 1, 7, 5, 7, 2, 2, 9, 8, 9};
int[] output = mergeSort(input);
}
您的代码中有两个问题:
- 返回数组元素
arr[0]
,而不是数组本身arr
- 您不处理
arr.length==0
的情况。它还应该返回arr
请注意,代码可以简化为:
- 复制值时,可以对索引值使用
++
运算符
- 您应该删除第二个和第三个
while
循环上的冗余测试
以下是一个改进的版本:
私有静态int[]合并(int[]a,int[]b)
{
int[]c=新的int[a.length+b.length];
int计数器A=0;
int计数器b=0;
int计数器c=0;
while(counterA!=a.length&&counterB!=b.length)
{
如果(a[counterA]开始较短,并开始“not random”。您仍处于开发阶段,因此:public static int[]mergeSort()
,然后使方法本身以int[]arr={9,1}开始
,然后开始逐步检查代码:每行应该发生什么?只有2个元素需要排序,所以很容易找到“在X行,变量应该指向看起来像Y的东西”。然后看看你是否正确。
9, 1, 7, 5, 7, 2, 2, 9, 8, 9
public static void main(String[] args) {
int[] input = new int[]{9, 1, 7, 5, 7, 2, 2, 9, 8, 9};
int[] output = mergeSort(input);
}