顺序合并在C中排序

时间:2013-03-31 20:56:49

标签: c merge mergesort

我正在尝试重写一个像

这样的递归合并排序
void MergeSort(int* data, int size){
  int half=size/2;
  if (size > 1) {
    MergeSort(data, half);
    MergeSort(data+half, half);
    Merge(data, size);
  }
}

其中

void Merge(int* data, int size){
  int cnt;
  int cntLow=0;
  int half=size/2;
  int cntHigh=half;
  int* sorted;

  sorted = (int*) malloc(size*sizeof(int));

  for (cnt=0; cnt<size; cnt++){
    if (cntLow == half) 
      sorted[cnt] = data[cntHigh++];
    else if (cntHigh == size)
      sorted[cnt] = data[cntLow++];
    else if (data[cntLow] <= data[cntHigh])
      sorted[cnt] = data[cntLow++];
    else
      sorted[cnt] = data[cntHigh++];
  }

  for (cnt=0; cnt<size; cnt++)
    data[cnt] = sorted[cnt];

  free(sorted);
}

到非递归调用。所以我写了函数

void MergeSort_NonRecursive(int* data, int size){
    int i;
    int j;

    for (i=size; i>0; i=i/2){
        for (j=0; j<i; j++){
            Merge(data + j*size/i, size/i);
        }
    }
}

显然适用于大小为$ 2 ^ n $的序列。但是,当我以大于$ 2 ^ n $的大小的顺序运行它时,它并不正确,所以在MergeSort_NonRecursive的某些点,我的代码我一定是错的。

那我在哪里做错了(MergeSort_NonRecursive)? (另外,我需要使用Merge功能)。

提前致谢。

1 个答案:

答案 0 :(得分:3)

由于size是int,size / 2会截断你的商。

e.g。如果size = 4,size / 2 = 2.如果size = 5,size / 2 = 2.如果size = 6,size / 2 = 3.

因此,对于大小为5,您希望对size / 2元素(即前3个)进行第一次MergeSort递归调用,然后对剩余的2个元素进行第二次调用。

你可以说例如。

int half = size/2; //size = 5: half = 2
int rest = size - half; //rest = 3

这样:

void MergeSort(int* data, int size){
  int half=size/2;
  int rest = size-half;
  if (size > 1) {
    MergeSort(data, half);
    MergeSort(data+half, rest); //changed this line
    Merge(data, size);
  }
}

编辑:

我发布后,看起来你稍微改了一下这个问题。一般的想法仍然存在:当你将int除以另一个int时,商被截断。

在您的MergeSort_NonRecursive中,您要在多个地方划分int,例如i=i/2j*size/isize/i。注意你会得到的价值。