Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我需要帮助排除我的合并排序和合并代码故障_Java_Mergesort_Array Algorithms - Fatal编程技术网

Java 我需要帮助排除我的合并排序和合并代码故障

Java 我需要帮助排除我的合并排序和合并代码故障,java,mergesort,array-algorithms,Java,Mergesort,Array Algorithms,因此,我一直在为一个算法项目研究MergeSort,但在获取对数组进行排序的代码时,我遇到了各种问题。每当我生成一个字符串并将其放入MergeSort时,结果似乎完全一样。我需要一些帮助来找出我的代码中的错误在哪里,为什么它会给我这个,以及一个简单但很好的解释的解决方案 以下是我过去尝试过的: 我曾尝试使用returnarr[0]而不是arr,但由于无法将int转换为int[],因此出现了一个错误 我看了我的合并课,那里一切似乎都很好 我和我的老师讨论过这个问题,他说一切看起来都很好,但我知道一

因此,我一直在为一个算法项目研究MergeSort,但在获取对数组进行排序的代码时,我遇到了各种问题。每当我生成一个字符串并将其放入MergeSort时,结果似乎完全一样。我需要一些帮助来找出我的代码中的错误在哪里,为什么它会给我这个,以及一个简单但很好的解释的解决方案

以下是我过去尝试过的:

  • 我曾尝试使用return
    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循环,check
    counterA==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);
        }