合并排序C语言 [英] Merge sort in 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 0
th index.
Output:
0
4
5
7
10
11
Rest you can check for yourself.
这篇关于合并排序C语言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!