c - 递归合并排序不起作用

标签 c arrays algorithm sorting mergesort

<分区>

我用 C 编写了一个递归归并排序算法。但它不起作用。

#include <stdio.h>

这是我的算法:

void mearge( int a[],int elementsOfA,int b[],int elementsOfB,int c[]){

    int elementsOfC = elementsOfB + elementsOfA;
    int i=0,j=0,k=0;

    while(k<elementsOfC){
        if(a[i]<=b[j] || j==elementsOfB) {
            c[k]=a[i];
            i++;
            k++;
        }

        if(b[j]<a[i] || i==elementsOfA) {
            c[k]=b[j];
            j++;
            k++;
        }
    }
}

void meargeSort(int a[], int indexOfLeft, int positionOfRight, int b[]){

    if(positionOfRight-indexOfLeft==1){
        b[0]=a[indexOfLeft];
    }

    if(positionOfRight-indexOfLeft>1){
       int mid = (positionOfRight+indexOfLeft)/2;
       //int left[mid-1],right[positionOfRight-mid];
       int left[mid],right[positionOfRight-mid];

       meargeSort(a,indexOfLeft,mid,left);
       meargeSort(a,mid,positionOfRight,right);
       mearge(left,mid-indexOfLeft,right,positionOfRight-mid,b);
    }
}

这是我的主要功能。我为算法提供了两个不同的输入:

  • 首先是数组arr
  • 其次是数组 brr。

在这两种情况下,输出都是不正确的排序

int main(int argc, char **argv)
{
    int i, arr[]={5,42,31,1,-1,23,0}, brr[7];

    meargeSort(arr,0,7,brr);

    //int i, brr[]={-1,23,0},brr[3];
    //meargeSort(arr,0,3,brr);

    for(i=0;i<7;i++)
        printf("%d ",brr[i]);

    return 0;
}

最佳答案

像这样修复

while(k<elementsOfC){
    if(j == elementsOfB || i != elementsOfA &&  a[i] <= b[j]){//need check `i`
        c[k++]=a[i++];
    } else if(i == elementsOfA || b[j] < a[i]){
        c[k++] = b[j++];
    }
}

关于c - 递归合并排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770704/

相关文章:

c - c 中的段错误 - 可能与指针有关

c - 如何将文件中的单独内容放入不同的数组中,以便它按照我需要的方式打印?

javascript - 如何在 NodeJS 中的任何 mongoose 模型中使用数组?

c++ - 在 C++ 中将数组作为函数参数传递

java - 使用分布式编程的字符计数

algorithm - 我们真的需要在 Johnson 算法中添加一个额外的节点吗?

c - 将第一个单词保存在c中的文件中

java - 在java中按需创建数组

algorithm - 如何证明以下代码的正确性?

C 代码获取相对于 UTC 的本地时间偏移量(以分钟为单位)?