【问题标题】:Merge sort not printing sorted array合并排序不打印排序数组
【发布时间】:2021-12-09 23:28:42
【问题描述】:

我的代码在打印未排序的数组后终止,并且在 ideone 上也出现运行时错误,我无法在其中找到错误。代码在函数中的第一个合并排序之前工作正常,但之后在不执行合并函数的情况下终止。我试过改变数组大小,但到目前为止没有任何效果。任何帮助将不胜感激。

#include<stdio.h>
#include<math.h>
void Merge(int arr[],int,int,int,int);

void printArray(int *arr,int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%d",arr[i]);
        printf(" ");
    }
    printf("\n");
}

void MergeSort(int arr[],int low,int high)
{
    
    int mid;
    if(low<high)
    {
       
        mid = ceil((low+high)/2);
      
        MergeSort(arr,low,mid-1);
        
        MergeSort(arr,mid,high);
     
        Merge(arr,low,mid-1,mid,high);
    }
}

void Merge(int arr[],int low,int mid1,int mid2, int high)
{
    
    int i,c,j;

    c = low;
    i = low;
    j  = mid2;

    int Temp[high-low+1];
    while(i <= mid1 && j<= high)
    {
        if(arr[i]<arr[j])
        {
            Temp[c] = arr[i];
            i++;
            c++;
        }
        else
        {
            Temp[c] = arr[j];
            j++;
            c++;
        }
    }    

    while(i<=mid1)
    {
        Temp[c] = arr[i]; 
        i++;
        c++;          
    }
    while(j<=high)
    {
        Temp[c] = arr[j]; 
        j++;
        c++;
    }
    
    for(int k=0;k<=high;k++)
    {
        arr[k] = Temp[k];
    }    
    
}

int main(void)
{
    int arr[] = {3,5,2,13,12,3,2,13,45};
    int n = sizeof(arr)/sizeof(arr[0]);
    printf("unsorted array: \n");
    printArray(arr,n);
    MergeSort(arr,0,n-1);
    printf("sorted array: \n");
    printArray(arr,n);
    return 0;

}

【问题讨论】:

标签: c algorithm sorting data-structures mergesort


【解决方案1】:

有几个问题:

  • ceil 没有用处,因为 / 将执行整数除法,因此已经舍入 向下
  • 与此相关,在接下来的递归调用中不应使用mid-1mid 作为参数,而应使用midmid+1Merge 的参数也应该这样做。
  • 您访问Temp 的方式有误。您将条目从 0 分配到 high-low,但以 c 的值(即 low)开始您的访问。您应该从索引 0 开始。
  • 在最后一个循环中,k 从 0 运行到 high,但迭代次数太多。它应该从low 开始,然后应该再次使用k-low 作为索引来调整对Temp 的索引访问。

以下是更正后的代码:

void MergeSort(int arr[],int low,int high)
{
    int mid;
    if(low<high)
    {
        mid = (low+high)/2; // <--
        MergeSort(arr,low,mid); // <--
        MergeSort(arr,mid+1,high); // <--     
        Merge(arr,low,mid,mid+1,high); // <--
     }
}

void Merge(int arr[],int low,int mid1,int mid2, int high)
{   
    int i,c,j;
    c = 0; // <--
    i = low;
    j  = mid2;

    int Temp[high-low+1];
    while(i <= mid1 && j<= high)
    {
        if(arr[i]<arr[j])
        {
            Temp[c] = arr[i];
            i++;
            c++;
        }
        else
        {
            Temp[c] = arr[j];
            j++;
            c++;
        }
    }    
    while(i<=mid1)
    {
        Temp[c] = arr[i]; 
        i++;
        c++;          
    }
    while(j<=high)
    {
        Temp[c] = arr[j]; 
        j++;
        c++;
    }
    for(int k=low;k<=high;k++) // <--
    {
        arr[k] = Temp[k-low]; // <--
    }
}

重要提示:我为您调试了代码,但这是您可以自己做的事情。在使用调试器单步执行代码时检查变量,并找出出乎意料的地方。这需要一些时间,但这是程序员需要学习的技能。

【讨论】:

    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多