合并排序C语言 [英] Merge sort in C

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

问题描述

我是新编程/ C。 我理解的合并排序的算法,该算法,但是当涉及到​​编程,看来我做错了什么。 任何人可以帮助?

感谢。

下面是我的code:

 合并(INT A [],INT磷,INT Q,INT读);
部分(INT A [],INT磷,INT读);

诠释的main()
{
INT A [6] = {10,5,4,0,11,7},N,Y,Z;

Y = 1; Z = sizeof的(A)/的sizeof(INT);

部分(A,Y,Z);
为(N = 0; N< Z; N ++)
的printf(%D \ N,A [N]);

    返回0;
}

部分(INT A [],INT磷,INT读)
{
    如果(P&所述; r)的
    {
        INT Q =(P + R)/ 2;
        部分(A,P,Q);
        部分(A,Q + 1,R);
        合并(A,P,Q,R);
    }
}

合并(INT A [],INT磷,INT Q,INT读)
{
    INT N1 = Q-R + 1,N 2 = R-Q,L [N1 + 1〕,R〔N2 + 1],I,J,K表;
    L [N1 + 1] = 100000;
    ř[N2 + 1] = 100000;
    对于(i = 0; I< N1;我++)
        L [i] = A [P-1 + 1];
    为(J = 0; J< N2; J ++)
         -  [R [J] = A [Q + J]。
    I = 0; J = 0;
    对于(K = 0; K< R; k ++)
        如果(L [1]  - ; = R [j]的)
    {
        A [K] = L [I]
        我++;
    }
    其他
    {
        A [K] = R [J]。
        J ++;
    }
}
 

解决方案

下面是你的更正code:

 #包括< stdio.h中>
#包括< limits.h中>

无效合并(INT A [],INT磷,INT Q,INT读);
空隙部(INT A [],INT磷,INT读);

诠释的main()
{
INT A [6] = {10,5,4,0,11,7},N,Y,Z;

Y = 0; Z = 6;

部分(A,0,Z-1); //通行证从0开始长度 -  1阵列
为(N = 0; N< Z; N ++)
的printf(%D \ N,A [N]);

    返回0;
}

空隙部(INT A [],INT磷,INT读)
{
    如果(P&所述; r)的
    {
        INT Q =(P + R)/ 2;
        部分(A,P,Q);
        部分(A,Q + 1,R);
        合并(A,P,Q,R);
    }
}

无效合并(INT A [],INT磷,INT Q,INT读)
{
    INT N1 = Q-P + 1,N 2 = R-Q;
    INT L [N1 + 1〕,R〔N2 + 1],I,J,K表;
    L [N1] = INT_MAX;
     -  [R(N2)= INT_MAX;

    对于(i = 0; I< N1;我++)
        L [i] = A [P + I]。

    为(J = 0; J< N2; J ++)
         -  [R [J] = A [Q + J + 1];

    I = 0; J = 0;

    对于(K = P,K< = R; k ++)
    {
        如果(L [1]  - ; = R [j]的)
        {
            A [K] = L [I]
            我++;
        }
        其他
        {
            A [K] = R [J]。
            J ++;
        }
    }
}
 

这些都是这是错误的部分:

  INT N1 = Q-R + 1,N2 = R-Q //  - >你的新的计算指标是错误的
 

这些指数带你出去的数组越界:

  L [N1 + 1] = 100000;
ř[N2 + 1] = 100000;
 

此外,而不是使用像 100000 使用 INT_MAX limits.h中的随机值的定点元素。

 的(K = 0; K< R; k ++)//  - >错误
 

您应该从数组的左手食指移动到从 0 右键没有个指标。

输出:

  0
4
五
7
10
11
 

放心,你可以检查自己。

I am new in programming/C. I understand the algorithm of merge-sort as an algorithm but when it comes to programming, it appears that I am doing something wrong. Could anybody help?

Thanks.

Here is my code:

merge(int A[],int p,int q,int r);
part(int A[],int p,int r);

int main()
{
int A [6]={10,5,4,0,11,7}, n,y,z;

y=1; z=sizeof(A)/sizeof(int);

part(A,y,z);
for(n=0;n<z;n++)
printf("%d\n", A[n]);

    return 0;
}

part(int A[],int p,int r)
{
    if (p<r)
    {
        int q=(p+r)/2;
        part(A,p,q);
        part(A,q+1,r);
        merge(A,p,q,r);
    }
}

merge(int A[],int p,int q,int r)
{
    int n1=q-r+1,n2=r-q,L[n1+1],R[n2+1],i,j,k;
    L[n1+1]=100000;
    R[n2+1]=100000;
    for (i=0;i<n1;i++)
        L[i]=A[p-1+i];
    for (j=0;j<n2;j++)
        R[j]=A[q+j];
    i=0;j=0;
    for (k=0;k<r;k++)
        if(L[i]<=R[j])
    {
        A[k]=L[i];
        i++;
    }
    else
    {
        A[k]=R[j];
        j++;
    }
}

解决方案

Here is your corrected code:

#include<stdio.h>
#include<limits.h>

void merge(int A[],int p,int q,int r);
void part(int A[],int p,int r);

int main()
{
int A [6]={10,5,4,0,11,7}, n,y,z;

y=0; z=6;

part(A,0,z-1); // Pass starting from 0 to Length - 1 of Array
for(n=0;n<z;n++)
printf("%d\n", A[n]);

    return 0;
}

void part(int A[],int p,int r)
{
    if (p<r)
    {
        int q=(p+r)/2;
        part(A,p,q);
        part(A,q+1,r);
        merge(A,p,q,r);
    }
}

void merge(int A[],int p,int q,int r)
{
    int n1=q-p+1,n2=r-q;
    int L[n1+1],R[n2+1],i,j,k;
    L[n1]=INT_MAX;
    R[n2]=INT_MAX;

    for (i=0;i<n1;i++)
        L[i]=A[p+i];

    for (j=0;j<n2;j++)
        R[j]=A[q+j+1];

    i=0;j=0;

    for (k=p;k<=r;k++)
    {
        if(L[i]<=R[j])
        {
            A[k]=L[i];
            i++;
        }
        else
        {
            A[k]=R[j];
            j++;
        }
    }
}

These are the parts which were wrong:

int n1=q-r+1,n2=r-q  // --> Your calculation of new indices was wrong

These indices take you out of bounds of the array:

L[n1+1]=100000;
R[n2+1]=100000;

Also instead of using a random value like 100000 use INT_MAX in limits.h for the sentinel element.

 for (k=0;k<r;k++) // ->wrong

You should move from left index of array to right not from 0th index.

Output:

0
4
5
7
10
11

Rest you can check for yourself.

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

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