C中的合并排序算法无法正常工作

时间:2015-07-06 12:12:40

标签: c algorithm sorting mergesort

我正在尝试在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',而不是排序数组。我真的希望有人可以帮助我。

2 个答案:

答案 0 :(得分:6)

您的import csv from django.db import models from movies.models import Movie from sys import argv script, filename = argv with open(filename) as csvfile: reader = csv.reader(csvfile) for row in reader: print (row) # _, created = Movie.title.get_or_create( # title=row[0], # ) 签名与您调用它的方式不符:

签名:

Traceback (most recent call last):
    File "import.py", line 3, in <module> 
        from movies.models import Movie
ImportError: No module named 'movies'

Invokation:

Merge()

当您将指针(void Merge(int *A,int *L,int leftCount, int *R, int rightCount) )解析(并稍后使用)为整数(Merge(A,L,R,mid,n-mid); )和整数(R)作为指针时,这会导致未定义的行为({ {1}})。

非常确定你的编译器会给你一个关于它的警告,确保你打开警告,你的编译器通常知道他在说什么:)

答案 1 :(得分: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;