合并排序 - 堆栈损坏错误

时间:2014-01-11 05:37:04

标签: c++ algorithm sorting mergesort

我正在用C ++编写基本的合并排序代码。当我在函数merge()中运行下面的代码时,我得到变量b的堆栈损坏异常。我只是无法弄清楚我做错了什么。任何帮助都非常感谢!!

这是我的代码:

template <class T>
class mSort 
{
    void mergeSort(T *a, int low, int high);
    void merge(T *a, int low, int mid, int high);
public:
    mSort(T* a, int size);
};

template<class T>
mSort<T>::mSort(T *a, int size)
{
    mergeSort(a, 0, size);
}
template<class T>
void mSort<T>::mergeSort(T *a, int low, int high)
{
    int m;
    if (low < high)
    {
        m = (low + high) / 2;
        //printf("mergeSort:low[%d], mid [%d], high [%d]\n", low, m, high);
        mergeSort(a, low, m);
        mergeSort(a, m+1, high);
        merge(a, low, m, high);
    }
}

template<class T>
void mSort<T>::merge(T *a, int low, int mid, int high)
{
    int b[20];
    int i = low, j = mid + 1, k = 0;

    while (i <= mid && j <= high) {
        if (a[i] <= a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    while (i <= mid)
        b[k++] = a[i++];

    while (j <= high)
        b[k++] = a[j++];

    k--;
    while (k >= 0) {
        a[low + k] = b[k];
        k--;
    }
}

输入数组: int a [20];

#define prep_intput_array(a,n)\
for (int i = 0; i < n; i++)\
{\
    a[i] = rand() % 65535;\
}\

像这样调用合并排序例程:

mSort<int> m1(a, 20);

代码基于此link

中的合并排序

2 个答案:

答案 0 :(得分:1)

您的high是数组的大小,假设20表示数组索引从0开始到19

您似乎正在尝试访问b[20] - &gt;这是数组的21st元素。显然是出界的。

下面的代码对我来说很可疑。它应该检查j<high(不是j<=high

while (i <= mid && j <= high) {

与以下代码相同:

 while (j <= high)
        b[k++] = a[j++];

答案 1 :(得分:0)

high在数组中以最大索引传递,大小为1,但是您传递的大小超过了数组中的最高索引,因此您可能会收到错误。