簡體   English   中英

C中的Mergesort無法正常工作

[英]Mergesort in C not working

我有這種合並排序實現不起作用,我不知道為什么。

方法如下:

    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是數組的長度減去一。

那是輸出:

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 

上半部順序完美,下半部也減一個。 我不知道問題出在哪里。

您的代碼有2個問題。

  1. 計算邊界不正確。
  2. 你有一個不正確while條件。

不正確while就在這里:

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

在此循環中,當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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM