我制作了一个程序,使用合并排序算法对列表进行排序。
问题是我认为它应该工作但它不起作用,merge函数返回一个作为参数发送的数组。你能看到我写的代码并告诉我出了什么问题,以及如何改进它。
由于
void merge_sort(int *niz, int low, int medium, int high) {
int *niz2 = new int[high-low];
int bottom = low;
int top = medium + 1;
for (int f1=low; f1<high-low; f1++) {
if (low > medium) {
niz2[f1] = niz[top++];
}
else if (top > high) {
niz2[f1] = niz[bottom++];
}
else if (niz[bottom] < niz[top]) {
niz2[f1] = niz[bottom++];
}
else {
niz2[f1] = niz[top++];
}
}
niz = niz2;
}
void merge(int *niz, int low, int high) {
if (low < high) {
int medium = (high+low)/2;
merge(niz, low, medium);
merge(niz, medium+1, high);
merge_sort(niz, low, medium, high);
}
}
程序的输出:
3 5 2 3 4 9 5 2 7 10
3 5 2 3 4 9 5 2 7 10
答案 0 :(得分:4)
您正在按值传递指针,因此在函数内部分配给niz
的值在调用函数中不可见。
你的签名应该是
void merge(int niz[], int low, int medium, int high)
和
void merge_sort(int niz[], int low, int high)
。
在您merge
merge_sort
的{{1}}底部,您应该将内容从niz2
复制回niz
,而不是niz = niz2
* 编辑 - *
此外,您的merge
函数错误(您将其命名为merge_sort
)。如果您使用low = 100
,medium = 120
,high = 140
。
然后for (int f1=low; f1<high-low; f1++)
永远不会循环。
应该是for (int f1=0; f1<high-low; f1++)
。上述错误的另一个结果是SIGSGV
,因为您将访问niz2
越界(对于给定的示例)。
答案 1 :(得分:3)
我认为此代码中存在许多错误,但最大的错误是
niz = niz2;
在这里,您尝试将niz2
数组复制回niz
,但它不会这样做,它只是复制指针。
答案 2 :(得分:1)
我发现您正试图通过niz2
将niz
的内容分配给niz = niz2;
。这是不正确的,因为niz
是值传递指针,而niz2
是指向数组的本地指针。
如果要将niz2
复制到niz
,您需要像for (int i = low; i < high; i++) niz[i] = niz2[i]
这样的循环,使用像memcpy这样的api函数来覆盖输入数组,或者如果您正在尝试重定向int* niz
指针以使用新创建的niz2
数组,然后您需要将输入作为指针传递,然后直接修改它,例如merge_sort(int** niz, int low...)
并通过{调用它{1}}。如果你确实修改输入指针指向一个新数组,那么你应该首先删除旧数组,例如merge_sort(&niz, 0, 20);
语句delete [] *niz; *niz = niz2;
将niz = niz2;
指向的地址复制到参数列表中的临时niz2
指针上。当您将指针传递给收到niz
的函数(例如int*
)时,您发送的指针将被复制到临时变量/指针foo(int* nPtr);
中。使用nPtr
告诉它它正在使用'指向to和int'的地址,而不仅仅是'int的地址'。在这种情况下,您可以通过foo(int** nPtr);
或nPtr
等语句重定向*nPtr = &tmpInt
。要从源代码获取实际的*nPtr = tmpPtr
或数据,您需要使用int
。