【问题标题】:Is there any logical issue in this mergesort...?where is it failing此合并排序中是否存在任何逻辑问题...?它在哪里失败
【发布时间】:2021-12-23 02:28:21
【问题描述】:

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

当我在合并排序后在主函数中打印 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,第二个是 temp 数组,我在其中存储排序的元素。

【问题讨论】:

    标签: java arrays mergesort


    【解决方案1】:

    在你的merge中,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++;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2014-03-16
      相关资源
      最近更新 更多