当前位置: 首页 > 知识库问答 >
问题:

这个合并排序有什么逻辑问题吗。。。?哪里出故障了

黄高爽
2023-03-14

在mergeSort函数中传递两个数组的main函数,一个原始数组和第二个临时数组,用于在其中存储排序值。

当我在合并排序后在主函数中打印 temp 时,我得到的输出为 temp = [3 2 6 4 7 8 5 8 1]。

static void main(String args[])
    {
          int arr[] = {6,4,7,8,5,3,2,8,1};
          int temp[] = new int[arr.length];
     
          for(int i=0;i<arr.length();i++)
          {
          temp[i] = arr[i];
          } 
          mergeSort(arr, temp, 0, arr.length-1);
          
          for(int num : temp)
          {
             System.out.print(num+" ")
          } 
    }

//merge function comparing array and assigning to a new temp array.
static void merge(int arr[],int temp[], int l, int mid, int r)
    {     
         int i = l;
         int j = mid+1;
         
         int index=l;
         while(i<=mid && j<=r)
         {   
             if(arr[i]<=arr[j])
             { 
                temp[index] = arr[i];
                i++;
             }
             else
             {
                temp[index] = arr[j];
                j++;
             }
             index++;
         }     
         while(i<=mid)
             {
                 temp[index] = arr[i];
                 i++;  
                 index++;   
             }
             
         while(j<=r)
             {
                 temp[index] = arr[j];
                 j++;
                 index++;
             }
    }

//mergeSort function
static void mergeSort(int arr[],int temp[], int l, int r)
        {
            if(l<r)
        {
           int mid = l + (r-l)/2;
           mergeSort(arr,temp,l,mid);
           mergeSort(arr,temp,mid+1,r);
           merge(arr,temp,l,mid,r);
        } 
        }

我在 mergeSort 函数中传递了两个数组。一个是原始的,它是arr,第二个是在其中存储排序元素的临时数组。

共有1个答案

齐意致
2023-03-14

在您的< code>merge中,每次都需要重新分配< code>arr,否则,之前的合并结果是无用的。(总是与您开始时的arr相同)

static void merge(int arr[],int temp[], int l, int mid, int r)
    {
        int i = l;
        int j = mid+1;
        for (int k = l; k < r + 1; k++) {
            arr[k] = temp[k];
        }
        int index=l;
        while(i<=mid && j<=r)
        {
            if(arr[i]<=arr[j])
            {
                temp[index] = arr[i];
                i++;
            }
            else
            {
                temp[index] = arr[j];
                j++;
            }
            index++;
        }
        while(i<=mid)
        {
            temp[index] = arr[i];
            i++;
            index++;
        }

        while(j<=r)
        {
            temp[index] = arr[j];
            j++;
            index++;
        }
    }
 类似资料:
  • 我试图在调试日志下面发出一个REST post调用。我尝试了不同的方法-信任许多不同风格的所有证书,将证书上载到java cacerts(JVM在加载时将证书显示为受信任的),但我仍然会变成failure_shake错误。下面的代码是否为您提供了有关问题的任何提示?使用Java8。

  • 我正在制作一个简单的Led程序,它将成为我项目的一个库。我创建了四种方法,可以让您A)根据需要设置尽可能多的Led引脚,并将其作为输出。B) 在自定义时间闪烁Led灯。C) 打开LED。D) 关闭LED。如果我只运行void循环()中的方法,一切都正常。例如: 如果我运行上面的代码,它工作得很好,但是它保持循环,因为它显然是在循环中。所以我决定用串口启动串口com。在setup()中开始(9600

  • 我在计算机课上遇到了合并排序的问题。我不断收到错误或返回原始ArrayList。 我相信合并排序涉及到将数组(列表)递归地对半拆分,直到只剩下一个元素,然后从这些单独的元素开始,按排序顺序合并它们。直到数组(列表)被排序为止。至于实际的排序部分,我试图在新的ArrayList中插入两半之间的较高值,直到它们都为空,在这种情况下,填充的ArrayList现在被排序。 这是我当前的代码: 我将感谢任何

  • 问题内容: 随着泛型的引入,我不愿意执行instanceof或强制转换。但是在这种情况下,我看不到解决方法: 在上面的代码中,我知道ICacheables只能是MyObject或OtherObject的实例,根据此,我想将它们放入2个单独的映射中,然后进行进一步处理。 如果没有我的instanceof check,还有其他方法可以做到这一点,我很感兴趣。 谢谢 问题答案: 您可以使用双重调用。无可

  • 奇怪的事情正在发生......我真的不明白为什么......这篇文章只有在将id参数类型从int更改为object时才有效。 我知道最好的方法是在url中设置值。。。然而我试图避免这件事。。。我的首选是将值作为json发布 public IHttpActionResult Gettest(int id)=不工作! {“Message”:“未找到与请求URI匹配的HTTP资源”http://loca