【发布时间】:2015-10-04 17:32:23
【问题描述】:
我正在尝试使用数组在 C 中实现归并排序,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void merge(int s[], int low, int middle, int high)
{
int i,l=0,r=0;
int left[high/2], right[high/2];
for(i = low; i<=middle; i++) left[i-low] = s[i];
for(i = middle+1; i<=high; i++) right[i-middle-1] = s[i];
i = low;
while(l <= middle-low || r <= high - middle - 1)
{
if(left[l] <= right[r])
{
s[i++] = left[l];
l++;
}
else
{
s[i++] = right[r];
r++;
}
}
while(l <= middle-low)
{
s[i++] = left[l];
l++;
}
while(r <= high - middle - 1)
{
s[i++] = left[r];
r++;
}
}
void mergesort(int s[], int low, int high)
{
int i;
int middle;
if(low < high){
middle = (low + high)/2;
mergesort(s, low, middle);
mergesort(s, middle+1, high);
merge(s, low, middle, high);
}
}
int main()
{
int nums[] = {5, 345, 1, 120, 40, 3450};
int size = (sizeof(nums))/(sizeof(int));
int i;
for(i = 0; i < size; i++)
printf("%d ", nums[i]);
printf("\n");
mergesort(nums, 0, size);
for(i = 0; i < size; i++)
printf("%d ", nums[i]);
printf("\n");
return 0;
}
输出:
5 345 1 120 40 3450
0 1 4 5 40 120
这有点接近。有人可以指出我的错误吗?谢谢。
【问题讨论】:
-
你的合并函数有可疑的
for循环上限,<=肯定是错误的。 -
乍一看:您的数组上限是排他性的,这在 C 中很常见。这意味着所有
<=作为循环条件可能应该只是<。当high为奇数时,您的右子数组也将少一个元素。 -
将所有
-
这就是为什么你真的应该在c中使用指针算术。您可以通过每次将要排序的子数组的开头传递给
mergesort()来更清楚地表达这一点,而不是捏造偏移量。此外,在堆栈上分配临时数组不会扩展到要排序的更大集合。 -
cmets 并没有说当您更改条件时您的代码将起作用。他们要求您进一步研究这些条件并检查您的代码。这些更改也不会破坏代码;代码已经坏了。
标签: c arrays sorting mergesort