我试图使用指针在C中编写mergeSort算法(我是新手)。我使用了static int n
(n =元素数量)和v
(元素数组)。使用mergeSort算法后,每次都会用随机数修改n
值。我做错了什么?
我在这里阅读输入内容
int *v = malloc(NMAX * sizeof(int));
int n;
scanf("%d", &n);
int i;
for (i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
这是mergeSort算法:
void mergeSort(int st, int dr, int *v) {
if (st < dr) {
int mij = (st + dr) / 2;
mergeSort(st, mij, &v);
mergeSort(mij + 1, dr, &v);
mergeElements(st, dr, &v);
}
}
void mergeElements(int st, int dr, int *v) {
int *auxArray = malloc((dr - st + 3) * sizeof(int));
int pos = 0;
int sPos = st;
int mij = (st + dr) / 2;
int dPos = mij + 1;
for (pos = 0; pos < (dr - st + 1); ++pos) {
if (dPos == dr + 1) {
auxArray[pos] = v[sPos];
sPos++;
} else if (sPos == mij + 1) {
auxArray[pos] = v[dPos];
dPos++;
} else {
if (v[sPos] < v[dPos]) {
auxArray[pos] = v[sPos];
sPos++;
} else {
auxArray[pos] = v[dPos];
dPos++;
}
}
}
int i;
for (i = 0; i < pos; ++i) {
v[st + i] = auxArray[i];
}
free(auxArray);
}
这是我得到错误的地方(在main
中):
mergeSort(0, n - 1, &v);
printf("%d", n);
我得到n
成为1998609340
而不是6
。
编辑:这是打印元素的位置:
for (i = 0; i < n; ++i) {
printf("%d ", v[i]);
}
答案 0 :(得分:0)
&v不应在对mergeSort和mergeElement的调用中传递。 &v实际上是int ** 类型,而您的函数原型支持int * 。 (在编译代码时一定有个警告)
嘿,这是调试后的代码(在调用mergeSort和mergeElements时将&v更改回v)
#include<stdio.h>
#include<stdlib.h>
#define NMAX 1000
void mergeElements(int st, int dr, int *v);
void mergeSort(int st, int dr, int *v) {
if (st < dr) {
int mij = ( st + dr ) / 2;
mergeSort(st, mij, v);
mergeSort(mij + 1, dr, v);
mergeElements(st, dr, v);
}
}
void mergeElements(int st, int dr, int *v) {
int *auxArray = malloc( (dr - st + 3) * sizeof(int) );
int pos = 0;
int sPos = st;
int mij = ( st + dr ) / 2;
int dPos = mij + 1;
for (pos = 0; pos < (dr - st + 1); ++pos) {
if (dPos == dr + 1) {
auxArray[pos] = v[sPos];
sPos ++;
} else if (sPos == mij + 1) {
auxArray[pos] = v[dPos];
dPos ++;
} else {
if (v[sPos] < v[dPos] ) {
auxArray[pos] = v[sPos];
sPos ++;
} else {
auxArray[pos] = v[dPos];
dPos ++;
}
}
}
int i;
for (i = 0; i < pos; ++i) {
v[st + i] = auxArray[i];
}
free(auxArray);
}
int main()
{
int *v = malloc( NMAX * sizeof(int) );
int n;
scanf("%d", &n);
int i;
for (i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
mergeSort(0,n-1,v);
for(int i=0;i<n;i++)
{
printf("%d ",v[i]);
}
printf("\n");
}