2015-07-06 83 views
2

我想在C中實現合併排序算法。我理解算法和邏輯應該如何運作,但是我一直遇到直接實現的一些困難。C中的合併排序算法無法正常工作

我知道有很多合併排序在線的例子,我也看到了一些StackOverflow職位類似的問題。但是,我希望有人能夠幫助我理解爲什麼我的代碼似乎無法正確運行。

我的代碼如下:

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

// Function to Merge Arrays L and R into A 
// leftCount = number of elements in L 
// rightCount = number of elements in R 

void Merge(int *A,int *L,int leftCount, int *R, int rightCount) 
{ 

// i, to mark the index of subarray (L) 
// j, to mark the index of subarray (R) 
// k, to mark the index of subarray (A) 

int i = 0; 
int j = 0; 
int k = 0; 

while(i<leftCount && j<rightCount) 
{ 
    if(L[i] <= R[j]) 
    { 
     A[k++] = L[i++]; 
    } 
    else 
    { 
     A[k++] = R[j++]; 
    } 
} 
while(i<leftCount) 
{ 
    A[k++] = L[i++]; 
} 
while(j<rightCount) 
{ 
    A[k++] = R[j++]; 
} 
} 

// Recursive function to sort an array of integers 

void MergeSort(int *A, int n) 
{ 
int i; 
int mid; 
int *L; 
int *R; 
if (n<2) // Base condition 
    { 
    return; 
    } 

mid = n/2; // Find the mid index 
L = (int*)malloc(mid*sizeof(int)); 
R = (int*)malloc((n-mid)*sizeof(int)); 

for(i=0;i<mid;i++) // Creating left subarray 
    { 
    L[i] = A[i]; 
    } 
for(i=mid;i<n;i++) // Creating right subarray 
    { 
    R[i-mid] = A[i]; 
    } 

MergeSort(L,mid); 
MergeSort(R,n-mid); 
Merge(A,L,R,mid,n-mid); 
free(L); 
free(R); 
} 

int main() 
{ 

int A[] = {2,4,1,6,8,5,3,7}; 
int i; 
int numberofelements; 
numberofelements = sizeof(A)/sizeof(A[0]); 
MergeSort(A,8); 

for(int i = 0; i<8; i++) 
    { 
    printf("%d ",A[i]); 
    return 0; 
    } 
} 

後,我運行此代碼,我只似乎得到的輸出「1」,而不是排序後的數組。我真的希望有人能幫助我。

回答

6

Merge()簽名不匹配你如何調用它:

簽名:

void Merge(int *A,int *L,int leftCount, int *R, int rightCount) 

Invokation:

Merge(A,L,R,mid,n-mid); 

這會導致不確定的行爲,當你解析(和更高版本)一作爲整數(leftCount)的指針(R)和作爲指針的整數(mid)(R)。

很肯定你的編譯器就會給你一個警告,請確保您打開警告,編譯器通常知道他在說什麼:)

+0

哦,那是一個相當小的錯誤!我應該仔細看看。無論如何感謝:) – adivk

+1

@adivk當然,很高興提供幫助。確保您將編譯器警告打開以避免將來出現。 – amit

5

讓自己使用-Wall編譯(如果你使用GCC)。如果你這樣做,你會看到你用錯誤的參數調用Merge()。它應該是:

Merge(A,L,mid,R,n-mid); 

此外,您不應該從打印數組元素的循環內部返回。這就是爲什麼你只看到一個1。仔細查看代碼:循環體從main()無條件返回,因此它只會執行一次。將return移出循環:

for(i = 0; i<8; i++) 
{ 
    printf("%d ",A[i]); 
} 

return 0;