如何在合并排序中设置 mid 的值

How do I set value of mid in Merge Sort?

本文关键字:设置 mid 的值 排序 合并      更新时间:2023-10-16

我已经实现了合并排序算法,但它为某些值抛出异常并显示某些值的正确值。例如:如果我的输入数组为:4 3 2 1,那么它会正确显示 1 2 3 4但是,对于输入:1 3 5 2 4 6,它会引发异常。我想这是因为我分配了中。这是我对merge函数的实现:

void mergeArr(int a[], int l, int mid, int r)
{
    int n1, n2;
    int i,j,k;
    int inv_count = 0;
    n1 = mid - l + 1;
    n2 = r - mid;
    int temp[r-l+1];
    int L[n1], R[n2];
    for(i = 0;i < n1;i++)
        L[i] = a[l+i];
    for(j = 0;j < n2;j++)
        R[j] = a[mid+j+1];
    i = j = 0;
    k = l;
    while(i<n1 && j<n2)
    {
       if(L[i] <= R[j])
            temp[k++] = L[i++];
        else
        {
            temp[k++] = R[j++];
            inv_count += (mid - i);
        }
    }
    while(i<n1)
        temp[k++] = L[i++];
    while(j<n2)
        temp[k++] = R[j++];
    for(i=l;i<=r;i++)
        a[i] = temp[i];
}

merge_sort功能:

void mergeSort(int a[], int l, int r)
{
    int inv_count = 0;
    if(l < r)
    {
        int mid;
        mid = (l + (r))/2;
        mergeSort(a,l,mid);
        mergeSort(a,mid+1,r);
        mergeArr(a,l,mid, r);
    }
    //return inv_count;

我发现了问题,将inv_count += (mid - i)替换为inv_count += (n1 - i)做了有意义的工作