细分错误,合并排序算法

时间:2018-07-15 03:30:31

标签: c++ mergesort

这是我编写的一种合并排序算法。虽然,它对于较小的数组效果很好,但对于包含7/8个以上元素的数组,它会产生分段错误。在某些情况下重复编号也会失败。例如-{5,5,1,2,1}。我一直在尝试找出错误,但无济于事

我知道代码不是完全有效,但是我正在集中精力使其立即工作。有关代码改进的建议将很有帮助。预先谢谢你。

#include <iostream>
using namespace std;
void printarray(int a[], int size);
void splitsort(int b[], int start, int end); //Split array into half
void merge(int b[], int start, int end); // merge the sorted arrays

int main()
{
    cout << "This is merge sort" << endl;
    int array[] = { 9,8,7,6,5,4,3,2,1 };
    int length = sizeof(array) / sizeof(array[0]);
    printarray(array, length);
    splitsort(array, 0, length - 1);
    cout << "sorted array" << endl;
    printarray(array, length);
    return 0;
}

void printarray(int a[], int size) {
    for(int i = 0; i<size; i++) {
        cout << a[i] << ",";
    }
    cout << endl;
    return;
}

void splitsort(int b[], int start, int end) {
    //base case
    if(end == start) { return; }

    //
    splitsort(b, start, (start + end) / 2);
    splitsort(b, (start + end) / 2 + 1, end);
    merge(b, start, end);

    return;
}

void merge(int b[], int start, int end) {
    int tempb[(end - start) + 1];

    //base case
    if(end == start) { return; } // if single element being merged
    int i = start;
    int j = (start + end) / 2 + 1;
    for(int k = start; k <= end; k++) {
        if(i == (start + end) / 2 + 1) { tempb[k] = b[j]; j++; }// finished first array
        else if(j == end + 1) { tempb[k] = b[i]; i++; }// finished second array
        else if(b[i] >= b[j]) {
            tempb[k] = b[j];
            j++;
        }
        else if(b[j] >= b[i]) {
            tempb[k] = b[i];
            i++;
        }
    }

    for(int k = start; k <= end; k++) {
        b[k] = tempb[k];
    }

    return;
}

1 个答案:

答案 0 :(得分:1)

int tempb[(end - start) + 1];

tempb最多可以包含2个元素,而主array可以包含10个元素。您最终访问了tempb[9],从而导致分段错误。

要解决此问题,请将大小更改为int tempb[max_size];,其中max_size是先前计算的array的大小int length = sizeof(array) / sizeof(array[0]);

tempb更改为std::vector<int> tempb(max_size)将有助于调试并符合C ++标准。