【发布时间】:2018-08-27 00:45:37
【问题描述】:
我一直在经历Introduction to Algorithms,并一直在尝试用C编程语言实现MERGE-SORT算法以更好地理解它。
本书提供了两个伪代码:
和
虽然我确实了解上述程序,但在实施过程中我一定遗漏了一些东西。
我一定是从伪代码中遗漏了一些东西,但还无法弄清楚。任何关于为什么会发生这种情况的建议将不胜感激。
编辑:更新的代码和输出
/* C program for Merge Sort */
#include<stdlib.h>
#include<stdio.h>
void MERGE(int [], int , int , int );
void printArray(int [], int );
void MERGE_SORT(int [], int , int );
int main(void)
{
int A[] = { 12, 11, 13, 5, 6, 7, 2, 9 };
int arr_size = sizeof(A) / sizeof(A[0]);
printf("Given array is \n");
printArray(A, arr_size);
MERGE_SORT(A, 0, arr_size); //Fixed: Index to start from zero
printf("\nSorted array is \n");
printArray(A, arr_size);
return 0;
}
void MERGE(int A[], int p, int q, int r)
{
int i = 0;
int j = 0;
int n1 = q - p + 1; //Computing length of sub-array 1
int n2 = r - q; //Computing length of sub-array 2
int *L = malloc((n1 + 2) * sizeof(*L + 1)); //Creating Left array
int *R = malloc((n2 + 2) * sizeof(*R + 1)); //Creating Right array
for (int i = 0; i <= n1; i++) { //Fixed: <=, i start from 0
L[i] = A[p + i - 1];
}
for (int j = 0; j <= n2; j++) { //Fixed: <=, i start from 0
R[j] = A[q + j];
}
L[n1 + 1] = 99; //Placing Sentinel at the end of array
R[n2 + 1] = 99;
i = 1;
j = 1;
/*Prior to the first iteration k = p, so the subarray is empty.
Both L[i] and R[j] are the smallest elements of their arrays and have not
been copied back to A*/
for (int k = p; k <= r; k++) { //Fixed: <=
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
}
else { //Fixed: Assignment and not condition check for A[k]
A[k] = R[j];
j++;
}
}
free(L);
free(R);
}
void MERGE_SORT(int A[], int p, int r)
{
//During first iteration p = 1 & r = 8
if (p < r) {
int q = (p + r) / 2;
MERGE_SORT(A, p, q);
MERGE_SORT(A, q + 1, r);
MERGE(A, p, q, r);
}
}
/* Function to print an array */
void printArray(int Arr[], int size)
{
int i;
for (i = 0; i < size; i++)
printf("%d ", Arr[i]);
printf("\n");
}
【问题讨论】:
-
如果您仔细查看伪代码,您会注意到您应该有
L[n1+1] = 99;和R[n2+1] = 99;。不是L[n1] = 99;和R[n2] = 99; -
@DmitriChubarov,我正在尝试,但是它会导致
Heap Corruption Detected,这意味着我正在写入未分配的内存,从而破坏了用于使内存分配器工作的数据结构。伪代码以 1-Indexed Array 表示法编写。 -
@DmitriChubarov,因为在第 3 行写了“让
L[1..n1 +1]”,这与L[0..n1]相同。因此稍后我将标记值写入L[n1]。如果我做错了什么,请纠正我。 -
你是对的,你必须在整个代码中小心地将索引从 1 更改为 0
-
你代码开头的函数声明都是错误的。您应该使用参数的类型,而不是名称(或类型和名称,就像在定义中一样)。
标签: c arrays algorithm sorting merge