C 合并排序:回答不正确
我正试图实现《算法导论》一书中所述的合并排序算法。 尽管实现如书中所述,但输出不正确。 很有可能是一个接一个的错误,但我不能对此指手画脚。 有什么建议吗C 合并排序:回答不正确,c,sorting,mergesort,C,Sorting,Mergesort,我正试图实现《算法导论》一书中所述的合并排序算法。 尽管实现如书中所述,但输出不正确。 很有可能是一个接一个的错误,但我不能对此指手画脚。 有什么建议吗 #include <stdio.h> #include <stdlib.h> #define SENTINEL 32767 int* getArray(int size) { int* arr; int i; arr = (int*) malloc(sizeof(int) * size);
#include <stdio.h>
#include <stdlib.h>
#define SENTINEL 32767
int* getArray(int size) {
int* arr;
int i;
arr = (int*) malloc(sizeof(int) * size);
printf("\nEnter %d elements:\n\n", size);
for (i = 0; i < size; ++i) {
scanf("%d", (arr + i));
}
printf("\n");
return arr;
}
void printArray(int* arr, int size) {
int i;
printf("Array[%d]: ", size);
for (i = 0; i < size; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
}
void merge(int* arr, int p, int q, int r) {
int i, j, k, n1, n2;
int* left;
int* right;
n1 = q - p;
n2 = r - q;
left = (int*) malloc(sizeof(int) * (n1 + 1));
right = (int*) malloc(sizeof(int) * (n2 + 1));
left[n1] = right[n2] = SENTINEL;
for (i = 0; i < n1; ++i) {
left[i] = arr[p + i];
}
for (j = 0; j < n2; ++j) {
right[j] = arr[q + j];
}
i = j = 0;
for (k = p; k < r; ++k) {
if (left[i] <= right[j]) {
arr[k] = left[i++];
} else {
arr[k] = right[j++];
}
}
}
void mergeSort(int* arr, int p, int r) {
if (p < r) {
int q = (p + r) / 2;
mergeSort(arr, p, q);
mergeSort(arr, q + 1, r);
merge(arr, p, q, r);
}
}
int main() {
int* arr;
int size;
printf("Enter array size: ");
scanf("%d", &size);
arr = getArray(size);
printArray(arr, size);
mergeSort(arr, 0, size);
printArray(arr, size);
return 0;
}
出于评论中已经说明的原因,mergeSort必须采用以下方式
void mergeSort(int* arr, int p, int r) {
if (r - p > 1) {//for call(a, 0, 1) -> call(a, 0, 1)
int q = (p + r) / 2;
mergeSort(arr, p, q);
mergeSort(arr, q, r);
merge(arr, p, q, r);
}
}
也需要自由左派;自由权利;和弗里亚 请发布一个输入/输出相关的示例:您不需要分配两个序列,只需要一个序列,也不需要为排序api分配两个参数;只要长度就行了。合并函数中有两个内存泄漏。最后,您的函数中似乎排除了r。如果是这样,您应该在p,q和q,r上调用。应该不需要+1。就我个人而言,我只会使用指针数学和单个长度。1当int a[n]时;应为call mergeSorta,0,n-1。但是你的代码调用mergeSorta,0,n。应以n不包括为前提。但是调用mergeSort,mergeSortarr,p,q;mergeSortarr,q+1,r;。所以q没有被处理。顺便说一句,更好地定义SENTINEL INT_MAX。一个关于free的问题,freelft,只会释放基址right?@ShantanuRaj free,释放malloc保护的整个区域。