问题描述
合并排序算法无法正常运行。输出值未按升序完全排序。一些值不正确,这表明存在错误。
#include <stdio.h>
#include <stdlib.h>
void merge(int *L,int *R,int *a,int nL,int nR) {
int i,j,k;
i = j = k = 0;
while ((i < nL) && (j < nL)) {
if (L[i] < R[j]) {
a[k] = L[i];
++i;
} else {
a[k] = R[j];
++j;
}
++k;
}
while (i < nL) {
a[k] = L[i];
++i;
++k;
}
while (j < nR) {
a[k] = R[j];
++j;
++k;
}
}
void mergeSort(int *a,int n) {
if (n < 2)
return;
int i,mid,*L,*R;
mid = n / 2;
L = (int *)malloc(mid * sizeof(int));
R = (int *)malloc((n - mid) * sizeof(int));
for (i = 0; i < mid; ++i) {
L[i] = a[i];
}
for (i = mid; i < n; ++i) {
R[i - mid] = a[i];
}
mergeSort(L,mid);
mergeSort(R,n - mid);
merge(L,R,a,n - mid);
free(L);
free(R);
}
int main() {
int i,n,*a;
scanf("%d",&n);
a = (int *)malloc(n * sizeof(int));
for (i = 0; i < n; ++i) {
scanf("%d",&a[i]);
}
mergeSort(a,n);
for (i = 0; i < n; ++i) {
printf("%d ",a[i]);
}
free(a);
return 0;
}
例如,对于以下输入:10 10 9 8 7 6 5 4 3 2 1
我应该得到以下输出:1 2 3 4 5 6 7 8 9 10
但是输出不是按升序排列的。输出为:1 3 4 5 2 6 8 9 10 7
解决方法
不确定是否可以解决所有问题,但
while((i < nL) && (j < nL))
应该是
while((i < nL) && (j < nR))
^
note