2013-12-21 46 views
0
# include <stdio.h> 
# include <stdlib.h> 
void mergesort(int array[],int i,int j); 
void merge(int a[],int i,int j); 

int main(int argc,char *argv[]) 
{ 
int array[] ={7,5,4,3,2,1}; 
mergesort(array,0,5); 
for (int i = 0; i < 6; ++i) 
{ 
    printf("%d ",array[i]); 
} 



return EXIT_SUCCESS; 
} 


void mergesort(int array[],int i,int j) 
{ 
int middle; 
if (i == j) 
    { 
    return; 
    } 
else 
    { 
    middle = (i+j)/2; 
    mergesort(array,i,middle); 
    mergesort(array,middle+1,j); 
    merge(array,i,j); 
    } 


} 

void merge(int array[],int i,int j) 
{ 
int b[100] = {0}; 
int forb = 0; 
int INIi = i; 
int middle = (i+j)/2; 
int k = middle+1; 
//MAKING TEMP ARRAY B 
while((i<= middle) && (k <= j)) 
{ 
    if (array[i] <= array[k]) 
    { 
     b[forb++] = array[i++]; 
    } 
    else if(array[i] > array[k]) 
    { 
     b[forb++] = array[k++]; 

    } 
} 
if (i>middle) 
{ 
    for(;k<=j;) 
    { 
    b[forb++] = array[k++]; 
    } 
} 
else if (k>j) 
{ 

for(;i<=middle;) 
    { 
    b[forb++] = array[i++]; 
    } 
} 
//COPYING BACK TO A 
for(;INIi<= j;INIi++) 

{ 
    array[INIi] = b[INIi]; 
} 

} 

問題是我只得到一半排序的數組不完整,我認爲代碼是好的,不知道什麼是錯誤的。合併功能正確放置仍然問題仍然存在。 當我用筆和紙的代碼應該工作,但不工作。謝謝你的幫助。Mergersort在C輸出

+1

使用調試器逐行瀏覽代碼,查看真正發生的情況。 –

+3

這是一個調試代碼的問題,它不可能幫助任何未來的訪問者。 – karlphillip

+0

你可以請幫忙,我不知道用C調試器呢。 – user2688772

回答

2

在合併代碼中,您將ijarray的元素複製到b[0]及更高版本中。

然後,在拷貝過來的代碼,你從b[INIi]複製(駭人聽聞的變量名,但是這是相切的bug)。只有當i爲0時才能正確工作;一般,i不是0

假設你有一個C99或C11編譯器(因此可以在一個函數定義在任意點的變量),那麼一個解決方法是:

int n = 0; 
for (; INIi <= j; INIi++) 
    array[INIi] = b[n++]; 

另外

if (i>middle) 
{ 
    for(;k<=j;) 
    { 
     b[forb++] = array[k++]; 
    } 
} 
else if (k>j) 
{ 
    for(;i<=middle;) 
    { 
     b[forb++] = array[i++]; 
    } 
} 

到:

01,僅供參考,您可以從主合併後循環簡化後處理
+0

非常感謝 – user2688772