【发布时间】:2017-05-26 06:54:35
【问题描述】:
它应该使用合并排序。有合并和排序合并两个功能。一些未知的函数(从文件中读取数组和打印数组)在输入文件中是完全可用的。
Valgrind 告诉我失败是在从 array2 分配以及在 void 合并中的第三个 while 循环读取和写入时。
void merge(int* array, int start, int middle, int end) {
int size = end - start + 1;
int *array2 = malloc(size*sizeof(array2));
int k = start;
int m = middle + 1;
int i = 0;
int j = 0;
while ( k <= middle && m <= end ) {
if ( array[k] <= array[m] ) {
array2[i] = array[k];
k++;
}
else {
array2[i] = array[m];
m++;
}
i++;
}
while ( k <= middle ) {
array2[i] = array[k];
k++;
i++;
}
while ( m <= end ) {
array2[i] = array[k];
k++;
i++;
}
while ( j < i ) {
array[ start + j -1 ] = array2[j];
j++;
}
free(array2);
}
void merge_sort(int* array, int first, int last) {
int middle;
if ( first < last ) {
middle = ((first+last) / 2);
merge_sort (array, first, middle);
merge_sort (array, middle + 1, last);
merge (array, first, middle, last);
}
}
int main (int argc, char *argv[])
{
if (argc!=3) {
printf ("usage: %s <maximale anzahl> <dateipfad>\n", argv[0]);
exit(2);
}
char *filename = argv[2];
int *array;
int size = atoi(argv[1]);
array = malloc(size*sizeof(array));
int len = read_array_from_file(array, atoi(argv[1]), filename);
printf("Eingabe:\n");
print_array(array, len);
merge_sort(array, array[0], len);
printf("Sortiert:\n");
print_array(array, len);
free(array);
return 0;
}
【问题讨论】:
-
请逐步调试您的代码,然后返回更准确的问题描述。
-
1)
array[ start + j -1 ] = array2[j]-->array[ start + j] = array2[j] -
2)
merge_sort(array, array[0], len);-->merge_sort(array, 0, len-1); -
3)
while ( m <= end ) { array2[i] = array[k]; k++;-->while ( m <= end ) { array2[i] = array[m]; m++; -
非常感谢...在 ich 更改后 3. 有效!
标签: c arrays dynamic segmentation-fault malloc