【问题标题】:Merge Sort Error C合并排序错误 C
【发布时间】:2013-10-12 12:28:14
【问题描述】:

我正在尝试实现合并排序算法。我正在遵循 CLRS 书中提到的算法。这是我的代码

#include<stdio.h>
#include<stdlib.h>
void merge_sort(int *arr,int start_index,int end_index);
void merge(int *arr,int start_index,int middle_index,int end_index);

int main(){

int arr[]={5,2,1,6,0,3,3,4}; //8 elements last index 7
int i;
printf("Before sorting.\n");
for(i=0;i<8;i++)
printf("%d",arr[i]);
merge_sort(arr,0,7);
printf("\nAfter sorting.\n");
for(i=0;i<8;i++)
printf("%d",arr[i]);

return 0;}

void merge_sort(int *arr,int start_index,int end_index){
    int middle_index;
    if(start_index<end_index)
    {
        middle_index=(start_index+end_index)/2;
        merge_sort(arr,start_index,middle_index);
        merge_sort(arr,(middle_index+1),end_index);
        merge(arr,start_index,middle_index,end_index);
    }

}

void merge(int *arr, int start_index,int middle_index, int end_index){

    int n1,n2,i,l,m;
    n1=middle_index-start_index+2;
    n2=end_index-middle_index+1;
    int sub_arr1[n1],sub_arr2[n2];
    for(i=0;i<(n1-1);i++)
        sub_arr1[i]=arr[i];
     for(i=0;i<(n2-1);i++)
        sub_arr2[i]=arr[middle_index+1+i];

    sub_arr1[n1+1]=100;
    sub_arr2[n2+1]=100;

    for(i=0;i<=end_index;i++){

        l=0,m=0;
        if(sub_arr1[l]<sub_arr2[m])
        {arr[i]=sub_arr1[l++];}
        else
         {arr[i]=sub_arr2[m++];}

    }}

我得到以下输出

Before sorting.
52160334
After sorting.
22222222
RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms

因为我取的是小整数,所以我取了 100 作为sentinel value。我想合并功能有问题。任何帮助表示赞赏。

【问题讨论】:

  • 第一次查看时:lm 似乎未初始化。 (您可以通过在程序的关键点放置一些 printf() 语句来轻松检查这一点)。还强烈建议对索引使用无符号类型(无符号不会溢出,但会围绕模 wordiz 折叠),并在代码中添加一些断言/检查。
  • 它们在最终的 for 块之前被初始化。
  • 这意味着它们总是为零。顺便说一句:请不要更新问题来修复错误。
  • 您应该将我的答案标记为正确答案。我已经浏览了你所有的递归代码。 :)
  • 感谢您的努力,并意识到您指出的错误确实是一个错误,但这并没有解决问题。错误已解决here

标签: c sorting


【解决方案1】:

问题很简单:你在merge(...)中的最后一个loop有问题。

在循环开始之前移动 l = 0m = 0,因为在每次循环迭代中,l 和 m 始终使用值 0 和 1。

改成:

int l=0, m=0;
for(i=0;i<=end_index;i++){   
    if(sub_arr1[l]<sub_arr2[m])
    {arr[i]=sub_arr1[l++];}
    else
     {arr[i]=sub_arr2[m++];}

}

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多