【发布时间】:2021-08-18 11:05:17
【问题描述】:
这是我在 C 中用于合并排序的代码。我无法理解这里的问题所在。我对指针的了解并不多。合并函数接受 2 个数组并将它们合并。 sort 函数是一个递归函数,应该对数组进行排序。
int * merge(int *fir, int n, int *sec, int m){
int res[m+n];
int x=0, y=0;
for(int i = 0; i < m+n; i++){
if(*(fir+x)<=*(sec+y)){
res[i] = *(fir+x);
x++;
}else{
res[i] = *(sec+y);
y++;
}
}
return res;
}
int * sort(int A[], int n){
if(n == 1){
return A;
}
int mid = n/2;
int AL[mid], AR[n-mid];
for(int i = 0; i < mid; i++){
AL[i] = A[i];
}
for(int i = 0; i < n-mid; i++){
AR[i] = A[i+mid];
}
int *BL, *BR;
BL = sort(AL, mid);
BR = sort(AR, n-mid);
return(merge(BL, mid, BR, n-mid));
}
int main(){
int n;
scanf("%d", &n);
int A[n];
for(int i = 0; i < n; i++){
scanf("%d", &A[i]);
}
int *sortedArray;
sortedArray = sort(A, n);
for(int i = 0; i < n; i++){
printf("%d ", *(sortedArray+i));
}
return 0;
}
这是输出
q8.c:16:9: warning: address of stack memory associated with local variable 'res' returned [-Wreturn-stack-address]
return res;
^~~
1 warning generated.
7
23 12 56 67 11 99 97
97 32766 539779418 32767 -2002825496 32767 6 %```
【问题讨论】:
-
您正在阅读超出数组的范围。合并数组时,有四种情况。您的代码错过了两种情况,即一个数组已用完,而您从另一个数组中取出第一项。
-
还有返回本地数组地址的问题。
res。从merge返回后,该数组将不再有效,指向它的指针将是“陈旧的”。 (这就是警告的内容。) -
对于
*(fir+x),你可以写fir[x],这样更容易阅读。 -
是的,我理解我的两个错误。非常感谢您指出它们!
标签: c sorting recursion mergesort