C,尝试制定合并排序算法,但我不断出现分段错误,不知道我做错了什么以及如何修复它

问题描述 投票:0回答:1
void mergeSort(int array[], int length);
void merge(int leftarray[], int rightarray[], int array[], int length);

int main(int argc, string argv[])
{

    int unsorted[] = {9, 3, 6, 1, 4, 5, 2, 8, 7};
    int length = sizeof(unsorted) / sizeof(int);

    printf("unsorted array: \n");
    for (int i = 0; i < length; i++)
    {
        printf("%d", unsorted[i]);
    }
    printf("\n");

    
    mergeSort(unsorted, length);
    printf("sorted array: \n");
    for (int i = 0; i < length; i++)
    {
        
        printf("%d", unsorted[i]);
    }
    printf("\n");
}

void mergeSort(int array[], int length)
{
    
    
    if(length <= 1)
    {
        return;
    }
    
    int middle = length / 2;
    int leftarray[middle];
    int rightarray[length - middle];
    

    for (int i = 0, j = 0; i < length; i++)
    {
        if(i < middle)
        {
            leftarray[i] = array[i];
        }
        else
        {
            rightarray[j] = array[i];
            j++;
        }

    }
   
    mergeSort(leftarray, length);
    mergeSort(rightarray, length);
    merge(leftarray, rightarray, array, length);


}

void merge(int leftarray[], int rightarray[], int array[], int length)
{
    
    int leftSize = length / 2;
    int rightSize = length - leftSize;

    int a = 0; 
    int l = 0; 
    int r = 0; 

    while(l < leftSize && r < rightSize)
    {
        if (leftarray[l] < rightarray[r])
        {
            array[a] = leftarray[l];
            l++;
            a++;
        }
        else
        {
            array[a] = rightarray[r];
            r++;
            a++;
        }
    }

    while(l < leftSize)
    {
        array[a] = leftarray[l];
        l++;
        a++;
    }
    while(r < rightSize)
    {
        array[a] = rightarray[r];
        r++;
        a++;
    }
}

花了一个小时试图找出解决问题的方法,但没有成功

arrays c mergesort
1个回答
0
投票

你的

mergeSort
函数的这一部分是错误的:

    mergeSort(leftarray, length);
    mergeSort(rightarray, length);

您传递的

length
与此处的输入相同,因此这将成为无限递归(或者超出范围的数组访问可能会发生运行时错误)。 该部分应该是:

mergeSort(leftarray, middle); mergeSort(rightarray, length - middle);

© www.soinside.com 2019 - 2024. All rights reserved.