合并排序算法建议

时间:2012-09-15 07:27:25

标签: c++ algorithm merge

我制作了一个程序,使用合并排序算法对列表进行排序。

问题是我认为它应该工作但它不起作用,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 

3 个答案:

答案 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 = 100medium = 120high = 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)

我发现您正试图通过niz2niz的内容分配给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