C中的Mergesort无法正常工作

时间:2018-05-28 14:59:52

标签: c arrays sorting mergesort

我有这种合并排序实现,但是无法解决原因。

以下是方法:

    void merge_sort(int A[], int i, int j)
    {
       if(i<j)
       {
           int n = j-i+1;
           int k = n/2;

           merge_sort(A, i, i+k-1);
           merge_sort(A, i+k, j);
           merge(A, i, i+k, j);
       }
    }

这就是合并方法:

 void merge(int A[], int a, int b, int j)
{
    int* T = malloc(sizeof(int)*DIM);
    int c=0;
    int h=a;

    while(a<b && b<=j)
    {
    if(A[a] > A[b])
        T[c++] = A[a++];
    else
        T[c++] = A[b++];
    }
    while(a<b) T[c++] = A[a++];
    while(b<=j) T[c++] = A[b++];

    c=0;
    while(h<=j)
    A[h++] = T[c++];


}

以下是我调用merge_sort的方法:

merge_sort(A, 0, DIM-1);

其中DIM是数组的长度减去1。

这是输出:

5 2 4 6 8 9 7 1 3 10 
0 9
0 4
0 1
2 4
3 4
5 9
5 6
7 9
8 9
10 9 8 7 10 6 5 4 3 2 

上半场完全有序,下半场也减去一。 我无法弄清楚问题出在哪里。

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题。

  1. 计算边界不正确。
  2. 您的while条件不正确。
  3. while不正确:

    while(a<b && b<=j)
    {
    if(A[a] > A[b])
        T[c++] = A[a++];
    else
        T[c++] = A[b++];
    }
    

    在这个循环中,当你处于你的状态时会增加b,这会影响你的循环。

    以下是我更正的代码(i包含在数组中而j被排除在外):

    void merge_sort(int A[], int i, int j)
    {
       if(j-i>=2) // since j is excluded, this condition means that we have more than 1 member.
       {
           int k = (j+i)/2;
    
           merge_sort(A, i, k);
           merge_sort(A, k, j);
           merge(A, i, k, j);
       }
    }
    
    void merge(int A[], int a, int b, int j)
    {
        int* T = malloc(sizeof(int)*DIM);
        int c=0;
        int h=a;
        int m = b;
    
        while(a<b && m<j) // b and j are excluded
        {
        if(A[a] > A[m])
            T[c++] = A[a++];
        else
            T[c++] = A[m++];
        }
        while(a<b) T[c++] = A[a++];
        while(m<j) T[c++] = A[m++];
    
        c=0;
        while(h<j)
        A[h++] = T[c++];
    }
    

    并运行:

    merge_sort(A, 0, DIM);