【发布时间】:2021-06-04 13:46:48
【问题描述】:
我参考了合并排序算法的clrs book of Introduction to Algorithms,并用C语言编写了一个程序。虽然我用笔和纸手动检查过,但代码似乎是正确的,但我也没有得到正确的输出。
输出如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void merge(int array[], int start, int middle, int end) {
int n1 = middle - start + 1;
int n2 = end - start;
int i;
int leftarray[n1 + 1], rightarray[n2 + 1];
for (i = 0; i < n1; i++) {
leftarray[i] = array[start + i];
}
for (int j = 0; i < n2; i++) {
rightarray[j] = array[middle + j + 1];
}
leftarray[n1 + 1] = 1000000;
rightarray[n2 + 1] = 1000000;
int k, j = 0;
i = 0;
for (k = start; k <= end; k++) {
if (leftarray[i] > rightarray[j]) {
array[k] = rightarray[j];
j++;
} else {
array[k] = leftarray[i];
i++;
}
}
}
void mergeSort(int array[], int start, int end) {
if (start < end) {
int middle = (start + end) / 2;
mergeSort(array, start, middle);
mergeSort(array, middle + 1, end);
merge(array, start, middle, end);
}
}
void sorting(int array[], int length) {
int i;
for (i = 0; i < length; i++) {
printf("%d ", array[i]);
}
}
int main() {
int noOfelements;
scanf("%d", &noOfelements);
int array[noOfelements];
for (int i = 0; i < noOfelements; i++) {
scanf("%d", &array[i]);
}
printf("Before Sorting: ");
sorting(array, noOfelements);
mergeSort(array, 0, noOfelements - 1);
printf("After Sorting: ");
sorting(array, noOfelements);
return 0;
}
上述程序的输出:
5
5 4 3 2 1
Before Sorting: 5 4 3 2 1 After Sorting: 2 0 5 0 32
【问题讨论】:
-
请不要将文字作为图片发布。直接将其作为文本复制到问题中。
-
@Sameer Vhatkar 例如,在此语句 printf("Before Sorting: "); 之后,您没有输出任何内容
-
@VladfromMoscow
sorting函数确实应该被称为printArray。 -
leftarray[n1+1] = 1000000;嗯... 什么 ??除了没有意义之外,这些行还调用了未定义的行为。 VLA 的大小只有n1+1,因此只能索引到n1。rightarray[n2+1] = 1000000;和n2也是如此。