【问题标题】:C++ Crashing in mergesort Function归并排序函数中的 C++ 崩溃
【发布时间】:2014-05-07 01:50:17
【问题描述】:

由于某种原因,我的程序在这个 mergeSort 函数中不断崩溃,该函数的目的只是对数据数组进行合并排序。在本例中,我使用的是字符串数组。

这里是归并排序函数代码:

template <class T>
void Metrics<T>::mergeSort(T *arr, int n)
{

if ( n < 10 ) 
{
    insertionSort(arr,n);
    return;
}

int mid = n / 2;
int mid2 = n - mid;

T *Left = new T[mid];
T *Right = new T[mid2];

for ( int i = 0; i < mid; i++ )
{
    Left[i] = arr[i];
}

for ( int i = 0; i < mid2; i++ )
{
    Right[i] = arr[mid+i];
}

mergeSort(Left, mid);
mergeSort(Right,mid);

merge(Left,mid,Right,mid2,arr);

delete Left;
delete Right;
}

这里是mergeSort函数中使用的合并函数:

template <class T>
void Metrics<T>::merge(T *a, int numA, T *b, int numB, T *c)
{
int i, j, k;
i = j = k = 0;

while ( i < numA && j < numB )
{
    if (a[i] <= b[j])
    {
        c[k] = a[i];
        i++;
        k++;
    }
    else
    {
        c[k] = b[j];
        j++;
        k++;
    }
}

while ( i < numA )
{
    c[k] = a[i];
    i++;
    k++;
}

while ( j < numB )
{
    c[k] = b[j];
    j++;
    k++;
}
}

我传入mergeSort函数的初始参数只是一个字符串数组,int n是36。哦对了,插入排序代码是这样的:

template <class T>
void Metrics<T>::insertionSort(T *arr, int n)
{
for ( int i = 1; i < n; i++ )
{
    int j = i;

    while ( j > 0 && arr[j] < arr[j-1] )
    {
        T temp = arr[j];
        arr[j] = arr[j-1];
        arr[j-1] = temp;
        j--;
    }
}
}

我很确定这与我将字符串数组发送到函数中这一事实有关。它只适用于整数和字符。谢谢!

编辑:: 稍微研究一下之后,我认为它在mergeSort 底部的“删除左侧”和“删除右侧”代码上崩溃了。这有什么原因吗?我该如何解决?这就是它崩溃的原因吗?

【问题讨论】:

    标签: c++ sorting merge crash


    【解决方案1】:

    您应该使用delete [] Leftdelete [] Right 来匹配new [] 调用。

    另外你调用mergeSort(Right,mid); 应该是mergeSort(Right,mid2); 但我不认为这会导致崩溃,当n 是奇数时只是一个未排序的项目。

    【讨论】:

    • Delete Left 和 Delete [] Left 有什么区别?感谢您的回复!
    • 你分配了一个数组,你删除了一个数组。否则行为未定义。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多