我的总体评价是“整洁很重要”,而你
merge()
代码一团糟。你没看到你把东西拿出来吗
ar2
但从来没往里面放东西?也,
arr2
不需要,所以把它扔掉。你的索引都错了。
您的缩进毫无价值,您希望如何调试任何东西?(除了让人们这么做你)想想每一行:它建立在前面的语句之上;它建立在下面的语句之上吗?想想每个索引:它从哪里开始;它应该从哪里结束?你的密码解开了:
#include <stdio.h>
void merge(int array[], int p, int q, int r)
{
int n1 = q - p + 1; // 1st half
int n2 = r - (q + 1) + 1; // 2nd half
int ar1[n1], ar2[n2];
for (int i = p, j = 0; j < n1; i++, j++)
{
ar1[j] = array[i];
}
for (int i = q + 1, j = 0; j < n2; i++, j++)
{
ar2[j] = array[i];
}
int i = 0, j = 0, n = p;
for (; i < n1 && j < n2; n++)
{
if (ar2[j] < ar1[i])
{
array[n] = ar2[j++];
} else {
array[n] = ar1[i++];
}
}
while (i < n1)
{
array[n++] = ar1[i++];
}
while (j < n2)
{
array[n++] = ar2[j++];
}
}
void mergesort(int array[], int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
mergesort(array, p, q);
mergesort(array, q + 1, r);
merge(array, p, q, r);
}
}
int main()
{
int array[] = {2, 4, 13, 4, 0, 23, 54, 12, 6, 9};
int length = sizeof(array) / sizeof(int);
mergesort(array, 0, length - 1);
for (int i = 0; i < length; i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}