c ++合并排序不工作和崩溃

时间:2017-08-16 15:43:13

标签: c++ mergesort

我试图用以下方式在c ++中实现合并排序:

#include <iostream>
using std::cout;
using std::endl;
using std::string;
using std::memcpy;

void mergeSort(int *array, int *temp, int leftStart, int rightEnd);
void mergeHalves(int *array, int *temp, int leftStart, int rightEnd);

void printArray(int* array, int size,string message){
    cout<<message<<endl;
    for (int i = 0; i < size; i++)
        cout << *(array+i) << "\t";
    cout << endl;
}
int main(){
    const int size = 10;
    int myInts[size] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    int temp[size] = {0};
    printArray(myInts,size,"Input");
    mergeSort(myInts, temp, 0, size-1);
    printArray(myInts, size, "Output:");

    return 0;
}

void mergeSort(int *array, int *temp, int leftStart, int rightEnd){
    if (leftStart >= rightEnd)
        return;

    int middle = (leftStart + rightEnd) / 2;

    mergeSort(array, temp, leftStart, middle);
    mergeSort(array, temp, middle + 1, rightEnd);
    mergeHalves(array,temp,leftStart,rightEnd);
    return;
}

void mergeHalves(int *array, int *temp, int leftStart, int rightEnd){
    int leftEnd = (rightEnd + leftStart) / 2;
    int rightStart = leftEnd + 1;
    int size = rightEnd - leftStart + 1;

    int left = leftStart;
    int right = rightStart;
    int index = leftStart;

    while (left <= leftEnd && right <= rightEnd){
        if (*(array+left) <= *(array+right)){
            *(temp+index) = *(array+left);
            left++;
        }else{
            *(temp+index) = *(array+right);
            right++;
        }
        index++;
    }

    memcpy(temp + index, array + left, (leftEnd - left + 1) * sizeof(int));
    memcpy(temp + index, array + right, (rightEnd - right + 1) * sizeof(int));
    memcpy(array, temp, size * sizeof(int));
}

我已经越来越多地检查了代码,我无法理解我所缺少的内容 该算法无法正常工作,初始值为

myInts[size] = {3, 6, 4, 2, 7, 8, 9, 1, 0, 5}

因为它只对数组的前半部分进行了排序 然后我尝试使用代码中显示的输入更改输入,并得到以下输出:

Input
9   8   7   6   5   4   3   2   1   0   
Output:
3   2   1   0   -161742639  6   5   4   7   8   
Abort trap: 6

过了一会儿,我重新编译并运行了相同的代码并获得了此输出:

Input
9   8   7   6   5   4   3   2   1   0   
Output:
3   2   1   0   6   5   4   7   8   9

在我看来,一些任务操作或复制操作也出错了,但是一切似乎都适合我。

我试过一步一步的调试,程序的流程似乎没问题 我正在运行MacOS X Sierra 10.12.6,我正在用g ++编译。

我错过了什么?我疯了......先谢谢!

编辑:我似乎解决了Abort Trap问题,我在size-1函数中编辑了代码size而不是main。仍然订购不起作用

1 个答案:

答案 0 :(得分:2)

经过大量的调试后,我发现了你的问题。您通过不同的函数将多个变量命名为相同的东西。其中一些变量意味着完全相同(leftStartrightEnd),而其他变量(如size则意味着完全不同的东西。

mergHalves结束时,您执行memcpy(array, temp, size * sizeof(int));可能是因为您认为size是整个数组的大小,因此您将所有内容复制回来。但是,它

该行应为memcpy(array+leftStart, temp+leftStart, size * sizeof(int));,因为在此函数中,您声明的大小为int size = rightEnd - leftStart + 1;。这是一个很好的例子,说明为什么让你的变量名更长一些,更具描述性可以节省你几个小时的调试(并且不得不在StackOverflow上发布)。

请参阅ideone上的修复操作。

最后,顺便说一句,我明白你想尝试这种“艰难的方式”,没有载体,但请不要做*(temp+index)之类的事情。 subscript operator是为了这个目的而制作的,意味着完全相同的东西,只是更具可读性。 (即改为temp[index])。