2011-11-02 30 views
0

這是基於Cormen書中給出的算法。我究竟做錯了什麼?MergeSort - 編譯但不提供任何輸出

#include <stdio.h> 
#include <conio.h> 

void mergesort(int a[],int,int); 
void merge(int a[],int,int,int); 

int main() 
{ 
    int i,num,a[50]; 

    printf("Enter the number of elements : "); 
    scanf("%d",&num); 

    for(i=1;i<=num;i++) 
    { 
     printf("\n%d) ",i); 
     scanf("%d",&a[i]); 
    } 

    mergesort(a,1,num); 

    for(i=1;i<=num;i++) 
    { 
     printf("SoRTED ArrAy \n"); 
     printf("\n%d) ",a[i]); 
    } 

    getch(); 

    return 0; 
} 

void mergesort(int a[],int i, int k) 
{ 
    int j; 
    j=(i+k)/2; 

    while(i<k) 
    { 
     mergesort(a,i,j); 
     mergesort(a,j+1,k); 
     merge(a,i,j,k); 
    } 
} 

void merge(int a[],int p,int q,int r) 
{ 
    int i,j,k,n1,n2; 

    n1=q-p+1; 
    n2=r-q; 

    int l[n1],s[n2]; 

    for(i=1;i<=n1;i++) 
    { 
     l[i]=a[p+i-1]; 
    } 

    for(j=1;i<=n2;j++) 
    { 
     s[j]=a[q+j]; 
    } 

    l[n1+1]=1000; 
    s[n2+1]=1000; 

    i=1; 
    j=1; 

    for(k=p;k<=r;k++) 
    { 
     if(l[k]<s[k]) 
     { 
     a[k]=l[i]; 
     i++; 
     } 
     else 
     { 
     a[k]=s[j]; 
     j++; 
     } 
    } 
} 
+0

「無輸出」是什麼意思? –

+0

嘗試運行...它只是在接受輸入後才發作。 – zedai

+0

您需要提供更多信息。你測試什麼輸入?你認爲什麼可能是錯誤的?你有沒有試過用調試器來瀏覽程序,看看會發生什麼?當你說「錯誤的產出」時,(1)你會得到什麼,以及(2)你期望什麼? –

回答

0
void mergesort(int a[],int i, int k) 
{ 
int j; 
j=(i+k)/2; 
while(i<k) 
{ 
    mergesort(a,i,j); 
    mergesort(a,j+1,k); 
    merge(a,i,j,k); 
} 
} 

沒什麼的while內改變的ik值。所以如果i<k,循環將永遠重複。

+0

中的L和R數組大小的另一個問題......在將「while」更改爲「if」之後......它給出錯誤的輸出.. ps。我還修正了聲明中的L和R數組大小 - – zedai

3

的主要問題是,ik從不更新在mergesort功能while循環中,導致一個無限循環。很可能你甚至不需要while循環。

+0

我應該在這個程序中做什麼改變? – zedai

+1

如果您重讀Cormen,您會看到mergesort遞歸調用由if,而不是一段時間來控制。 –

+0

另一個問題......在改變「 」之後,「如果」如果......它給出錯誤的輸出.. ps。我也更正了聲明 – zedai

相關問題