归并排序错误C [英] Merge Sort Error C

查看:147
本文介绍了归并排序错误C的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现合并排序算法。我下面在CLRS book.Here提到的算法是我的code

I am trying to implement the Merge Sort algorithm. I am following the algorithm mentioned in the CLRS book.Here is my code

#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作为标记值。我想有一些错误的合并功能。任何帮助AP preciated。

Since I am taking small integers, I have taken 100 as the sentinel value. I guess there is something wrong with the merge function. Any help appreciated.

推荐答案

这个问题很简单:你上次循环合并(。 ..)有问题。

The problem is very simple: your last loop in the merge(...) has a problem.

移动 L = 0 M = 0 前循环开始,因为你正在使用的值0和1升和总是男,在每个循环迭代。

Move the l = 0 and m = 0 before the loop starts, because you are using the values 0 and 1 for l and m always, in each loop iteration.

将其更改为:

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

}

这篇关于归并排序错误C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆