最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

合并排序C语言

SEO心得admin79浏览0评论
本文介绍了合并排序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.

发布评论

评论列表(0)

  1. 暂无评论