簡體   English   中英

歸並排序程序

[英]Merge Sort Program

#include<stdio.h>
#include<stdlib.h>

void merge(int a[],int l,int m,int r)
{
    int i,j,k;
    int n1= m - l + 1;
    int n2= r - m;
    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[m + 1+ j];
    i=0;j=0;k=l;
    while(i<n1 && j<n2)
    {
        if(L[i]<R[j])
        {
            a[k]=L[i];
            i++;
        }
        else
        {
            a[k]=R[j];
            j++;
        }
        k++;
    }
    while(i<n1)
    {
        a[k]=L[i];
        i++;
        k++;
    }
    while(j<n2)
    {
        a[k]=R[j];
        j++;
        k++;
    }
}

void mergeSort(int a[],int l,int r)
{
    if(l<r)
    {
        int m = l+(r-1)/2;
        mergeSort(a,l,m);
        mergeSort(a,m+1,r);
        merge(a,l,m,r);
    }   
}

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

int main()
{
    int a[]= {
                12,76,34,45,63,98
             };
    int n = sizeof(a)/sizeof(a[0]);
    printf("The element entered in array   ");
    printArray(a,n);
    mergeSort(a,0,n-1);
    printf("The element after sorting    ");
    printArray(a,n);
    return 0;
}

這是一個歸並排序程序。 如果有人可以解釋,為什么會出現運行時錯誤? 這個程序沒有錯誤

我已經嘗試了 10 次。 並且無法找到解決方案。

當您調用mergesort(a, 3, 5) ,會發生以下情況:

int m = l+(r-1)/2;  // 3 + (5-1)/2 -> 3 + 4/2 -> 3 + 2 -> 5
mergeSort(a,l,m);   // So this will call: mergesort(a, 3, 5) again

換句話說:無限循環。

也許你想要這個:

int m = (l+(r-1))/2;

        ^       ^
         notice

那我是怎么發現這個bug的呢?

非常簡單 - 只需使用一些 printf 調試。

首先,我在mergesort開始時添加了一個打印 - 如:

void mergeSort(int a[],int l,int r)
{
    printf("mergesort %d %d\n", l, r);  // Debug print
    if(l<r)
    {
        int m = (l+(r-1))/2;
        mergeSort(a,l,m);
        mergeSort(a,m+1,r);
        merge(a,l,m,r);
    }   
}

並得到輸出:

mergesort 3 5
mergesort 3 5
mergesort 3 5
...
...

這告訴我輸入值 3 和 5 存在無限循環。

然后我添加了一個m的打印

void mergeSort(int a[],int l,int r)
{
  printf("mergesort %d %d\n", l, r);
    if(l<r)
    {
        int m = (l+(r-1))/2;
        printf("m %d\n", m);
        mergeSort(a,l,m);
        mergeSort(a,m+1,r);
        merge(a,l,m,r);
    }   
}

並得到輸出:

mergesort 3 5
m 5
mergesort 3 5
m 5
mergesort 3 5
m 5

所以顯然m計算錯誤。

近距離看

int m = l+(r-1)/2;

很明顯,加法應該除法之前 一組(....)丟失了。

希望您可以將這個調試示例用於您自己的調試。

暫無
暫無

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

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