我想实现合并排序,即使我没有要求我这样做。
下面是我的代码,我已经保留了一些printf函数来演示错误。
该程序似乎工作但是当我在递归中进入我的几个最终合并时,它开始超出数组的参数并开始比较垃圾值。它的工作原理是因为这些值是正数,但如果一个是负数,它会将值存储在我的数组中。
我试图找到错误,我可以看到它与关系运算符有关但我无法找到修复。
非常感谢正确方向的任何一点。
#include <stdio.h>
#define SIZE 21
int temp_array[SIZE] = {0};
void sort(int array[], int start, int end);
void merge(int array[], int start_1, int end_1, int start_2, int end_2);
int main()
{
int array[SIZE] = {10, 1, 8, 3, 6, 5, 4, 7, 2, 9, 0, 100, 91, 98, 93, 96, 95, 94, 97, 92, 99};
sort(array, 0, SIZE-1);
for(int i = 0; i < SIZE; i++)
{
printf(" %i ", array[i]);
}
}
void sort(int array[], int start, int end)
{
if (end > start)
{
int middle = (start + end) / 2;
// sort left half
printf("sorting left half\n");
sort(array, start, middle);
// sort right half
printf("sorting right half\n");
sort(array, middle + 1, end);
// merge the two halves
printf("####MERGING#####\n");
merge(array, start, middle, middle + 1, end);
}
}
void merge(int array[], int start_1, int end_1, int start_2, int end_2)
{
int counter = 0;
int s1 = start_1;
while(start_1<=end_1 && start_2<=end_2)
{
printf(" %i %i and %i %i\n", start_1, end_1, start_2, end_2);
if(array[start_1] < array[start_2])
{
printf("selecting %i over %i\n", array[start_1], array[start_2]);
temp_array[counter++] = array[start_1++];
}
else
{
temp_array[counter++] = array[start_2++];
printf("selecting %i over %i\n", array[start_2], array[start_1]);
}
}
while (start_1 <= end_1)
{
temp_array[counter++] = array[start_1++];
printf("Dumping Left Half: placing %i in position %i\n", array[start_1], counter);
}
while (start_2 <= end_2)
{
temp_array[counter++] = array[start_2++];
printf(" Dumping Right Half: placing %i in position %i\n", array[start_2], counter);
}
for(int i = s1, j = 0; i <= end_2; j++, i++)
{
printf("Placing %i in position %i\n", temp_array[j], i);
array[i] = temp_array[j];
}
return;
}
答案 0 :(得分:1)
对我来说可疑的一件事是你的合并代码else
内部:
temp_array[counter++] = array[start_2++];
printf("selecting %i over %i\n", array[start_2 /* HERE */], array[start_1]);
假设start_2 == end_2
在执行上述操作之前保持不变,那么printf
将从索引end_2 + 1
读取,这将在sort
的最外层递归调用中超出范围因此未定义的行为(可能导致打印垃圾)。