【发布时间】:2017-10-01 15:38:10
【问题描述】:
我试图为学校项目“升级”我的正常合并排序。但是我的新代码似乎没有应有的协同作用
所以我有一个 MergeSort3way 函数,该函数将输入的数组拆分为 3 个子数组,然后它会调用自身直到排序完成,但输出离正确的很远。
void Mergesort3way(int A[],int n){
//Sort array A with divition of 3
int B[n/3];
int C[n/3];
int D[n/3];
int i,c;
if(n>1){
for(i=0;i<n/3;i++){
B[i]=A[i];
}
for(i=n/3;i<2*n/3;i++){
c= i-n/3;
C[c]=A[i];
}
for(i=2*n/3;i<n;i++){
c=i-(2*n/3);
D[c]=A[i];
}
Mergesort3way(B,n/3);
Mergesort3way(C,n/3);
Mergesort3way(D,n/3);
int bn = sizeof(B)/sizeof(B[0]);
int cn = sizeof(C)/sizeof(C[0]);
int dn = sizeof(D)/sizeof(D[0]);
Merge3way(B,C,D,A,bn,cn,dn);
}
}
然后merge3way将它们组合成1个单一的排序数组
void Merge3way(int B[],int C[],int D[],int A[],int p,int q,int r){
int i=0,j=0,u=0,k=0;
while(i<p && j<q && u<r){
if(B[i]<C[j]){
if(B[i]<D[u]){
A[k]=D[u];
u++;
}else{
A[k]=B[i];
i++;
}
}else{
if(C[j]<D[u]){
A[k]=D[u];
u++;
}else{
A[k]=C[j];
j++;
}
}
k++;
}
int all = p+q+r;
if(i==p){
if(u==r){
while(j<q && k<all){
A[k]=C[j];
k++;
j++;
}
}else{
while(u<r && k<all){
A[k]=D[u];
k++;
u++;
}
}
}else if(j==q){
if(u==r){
while(i<p && k<all){
A[k]=B[i];
k++;
i++;
}
}
}
}
您能否建议我任何解决方案,以便我可以按照它应该进行的排序,我已经尝试了 2 多个小时的修改,结果始终相同。在此先感谢,因为这是我第一次使用该网站,所以请不要感到难过。
【问题讨论】:
-
不要数组
C和D,不是n/3元素,而是2*n/3 - n/3和n - 2*n/3元素,分别?另外:2*n/3并不总是等于2*(n/3)。 -
...如果
n不是3的倍数,则定义的三个数组(每个数组都包含n/3元素)将不会在它们之间总共包含n元素。 -
我建议使用单个无限循环,例如
while (1) { }。在循环体中,找出三个中最好的,记住一两个列表可能是空的。将最好的项目添加到输出中,并增加相应的索引。在循环结束时,检查三个列表是否都为空,如果是,则break循环。