【问题标题】:recursive Merge Sort is not working [closed]递归合并排序不起作用[关闭]
【发布时间】:2016-12-10 18:36:38
【问题描述】:

我用 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;
}

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 您应该在 merge_sort() 函数中填充 left[]/right[] 数组

标签: c arrays algorithm sorting mergesort


【解决方案1】:

像这样修复

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++];
    }
}

【讨论】:

  • 它对我有用。我想知道为什么我们要在 if 语句中检查“i != elementsOfA &&”。我不明白。
  • 好的...我知道了...谢谢您的帮助...
猜你喜欢
  • 2015-09-20
  • 2016-09-29
  • 2016-04-30
  • 1970-01-01
  • 2021-11-06
  • 2019-01-22
相关资源
最近更新 更多