簡體   English   中英

C中的合並排序算法無法正常工作

[英]Merge Sort Algorithm in C not working properly

我試圖在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',而不是排序數組。 我真的希望有人可以幫助我。

您的Merge()簽名與您調用它的方式不匹配:

簽名:

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

Invokation:

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

當您將指針( R )解析(並稍后使用)為整數( leftCount )和整數( mid )作為指針( R )時,這會導致未定義的行為。

很確定你的編譯器會給你一個關於它的警告,確保你打開警告,你的編譯器通常知道他在說什么:)

讓自己習慣用-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;

暫無
暫無

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

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