C++ C++;用于可变大小数组的合并排序算法

C++ C++;用于可变大小数组的合并排序算法,c++,arrays,algorithm,mergesort,C++,Arrays,Algorithm,Mergesort,在花了数小时在线搜索如何进行合并排序并遵循我发现的算法后,我遇到了一些问题,这导致了一个堆栈溢出错误,我似乎无法跟踪 template <class T> void mergeSort(T list[], int lowerBound, int upperBound) { int mid; if (upperBound > 1) { mid = ( 1 + upperBound) / 2; mergeSort(list,

在花了数小时在线搜索如何进行合并排序并遵循我发现的算法后,我遇到了一些问题,这导致了一个堆栈溢出错误,我似乎无法跟踪

template <class T>
void mergeSort(T list[], int lowerBound, int upperBound)
{
    int mid;

    if (upperBound > 1)
    {
        mid = ( 1 + upperBound) / 2;
        mergeSort(list, lowerBound, mid);    
        mergeSort(list, lowerBound + 1, upperBound);
        merge(list, lowerBound, upperBound, mid);
    }
}

template <class T>
void merge(T list[], int lowerBound, int upperBound, int mid)
{
    int* leftArray = NULL;    
    int* rightArray = NULL;     
    int i, j, k;    
    int n1 = mid - lowerBound + 1;
    int n2 = upperBound - mid;    
    leftArray = new int[n1];    
    rightArray = new int[n2];       
    for (i = 0; i < n1; i++)
        leftArray[i] = list[lowerBound + i];    
    for (j = 0; j < n2; j++)
        rightArray[j] = list[mid + 1 + j];

    i = 0;
    j = 0;
    k = lowerBound;

    while (i < n1 && j < n2)
    {
        if (leftArray[i] <= rightArray[j])
        {
            list[k] = leftArray[i];
            i++;
        }
        else
        {
            list[k] = rightArray[j];
            j++;
        }

        k++;
    }

    while (i < n1)
    {
        list[k] = leftArray[i];
        i++;
        k++;
    }

    while (j < n2)
    {
        list[k] = rightArray[j];
        j++;
        k++;
    }

    delete [] leftArray;  
    delete [] rightArray;
}
模板
无效合并排序(T列表[],int下限,int上限)
{
int mid;
如果(上限>1)
{
中间=(1+上限)/2;
合并排序(列表、下限、中间);
合并排序(列表,下限+1,上限);
合并(列表、下限、上限、中间);
}
}
模板
无效合并(T列表[],int下限,int上限,int中间)
{
int*leftArray=NULL;
int*rightArray=NULL;
int i,j,k;
int n1=中下边界+1;
int n2=上限-中间值;
leftArray=newint[n1];
rightArray=新整数[n2];
对于(i=0;iif(leftArray[i]Okkk..So,在您对注释进行了所有更改之后,我认为唯一的问题是主函数的
mergesort
调用。 我相信您的mergesort调用看起来像这样
mergesort(列表,1,5)
(对于大小为5的数组)。 尝试将其更改为
mergeSort(列表,0,4)

所以,现在您的代码应该如下所示:

void mergeSort(int list[], int lowerBound, int upperBound)
{
    int mid;

    if (upperBound > lowerBound)
    {
        mid = ( lowerBound + upperBound) / 2;
        mergeSort(list, lowerBound, mid);
        mergeSort(list, mid + 1, upperBound);
        merge(list, lowerBound, upperBound, mid);
    }
}
void merge(int list[], int lowerBound, int upperBound, int mid)
{
    int* leftArray = NULL;
    int* rightArray = NULL;
    int i, j, k;
    int n1 = mid - lowerBound + 1;
    int n2 = upperBound - mid;
    leftArray = new int[n1];
    rightArray = new int[n2];
    for (i = 0; i < n1; i++)
        leftArray[i] = list[lowerBound + i];
    for (j = 0; j < n2; j++)
        rightArray[j] = list[mid + 1 + j];

    i = 0;
    j = 0;
    k = lowerBound;

    while (i < n1 && j < n2)
    {
        if (leftArray[i] <= rightArray[j])
        {
            list[k] = leftArray[i];
            i++;
        }
        else
        {
            list[k] = rightArray[j];
            j++;
        }

        k++;
    }

    while (i < n1)
    {
        list[k] = leftArray[i];
        i++;
        k++;
    }

    while (j < n2)
    {
        list[k] = rightArray[j];
        j++;
        k++;
    }

    delete [] leftArray;
    delete [] rightArray;
}
int main(void) {
    int a[]={7,4,2,19,5};
    int i;
    mergeSort(a,0,4);
    for(i=0;i<5;i++)
        cout<<a[i]<<"\n";
    return 0;
}
我刚刚删除了
模板
部分,因为我对它不太熟悉。但是,我认为这不会有多大区别

这是指向代码执行的ideone链接::

对我来说似乎很好。如果有什么不对劲,一定要告诉我


希望这能有所帮助。

Okkk..因此,在您对注释进行了所有更改之后,我认为唯一的问题是主函数的
mergesort
调用。 我相信您的mergesort调用看起来像这样
mergesort(列表,1,5)
(对于大小为5的数组)。 尝试将其更改为
mergeSort(列表,0,4)

所以,现在您的代码应该如下所示:

void mergeSort(int list[], int lowerBound, int upperBound)
{
    int mid;

    if (upperBound > lowerBound)
    {
        mid = ( lowerBound + upperBound) / 2;
        mergeSort(list, lowerBound, mid);
        mergeSort(list, mid + 1, upperBound);
        merge(list, lowerBound, upperBound, mid);
    }
}
void merge(int list[], int lowerBound, int upperBound, int mid)
{
    int* leftArray = NULL;
    int* rightArray = NULL;
    int i, j, k;
    int n1 = mid - lowerBound + 1;
    int n2 = upperBound - mid;
    leftArray = new int[n1];
    rightArray = new int[n2];
    for (i = 0; i < n1; i++)
        leftArray[i] = list[lowerBound + i];
    for (j = 0; j < n2; j++)
        rightArray[j] = list[mid + 1 + j];

    i = 0;
    j = 0;
    k = lowerBound;

    while (i < n1 && j < n2)
    {
        if (leftArray[i] <= rightArray[j])
        {
            list[k] = leftArray[i];
            i++;
        }
        else
        {
            list[k] = rightArray[j];
            j++;
        }

        k++;
    }

    while (i < n1)
    {
        list[k] = leftArray[i];
        i++;
        k++;
    }

    while (j < n2)
    {
        list[k] = rightArray[j];
        j++;
        k++;
    }

    delete [] leftArray;
    delete [] rightArray;
}
int main(void) {
    int a[]={7,4,2,19,5};
    int i;
    mergeSort(a,0,4);
    for(i=0;i<5;i++)
        cout<<a[i]<<"\n";
    return 0;
}
我刚刚删除了
模板
部分,因为我对它不太熟悉。但是,我认为这不会有多大区别

这是指向代码执行的ideone链接::

对我来说似乎很好。如果有什么不对劲,一定要告诉我


希望这有帮助。:

您对调试做了什么?您是否检查了for/while循环是否始终保持在边界内?在函数
mergesort
中,根据我的判断,
if
条件应为
if(上限>下限)
我在函数中使用了断点,但它们都没有点击编辑:修复了if语句,但是元素在递归调用
mergeSort(list,lowerBound+1,upperBound);
它不应该是
mergeSort(list,mid+1,upperBound);
还有为什么
mid=(1+upperBound)/2
不应该是
mid=(下界+上界)/2
。请解释一下,如果你认为我说的任何话都不符合你的逻辑。是否有原因
std::
函数是不可行的?你做了什么调试?你检查过for/while循环是否总是在边界内吗?在你的函数
mergesort
中,我认为
if
条件应该是
if(上界>下界)
我在函数中使用了断点,它们甚至都没有点击编辑:修复了if语句,但是元素没有被排序,当你递归调用
mergeSort(list,lowerbound+1,upperbound);
它不应该是
mergeSort(list,mid+1,upperbound)吗
此外,为什么
mid=(1+上限)/2
不应该是
mid=(下限+上限)/2
。请解释一下,如果你相信我说的任何话不符合你的逻辑。有什么原因吗
std:
函数是不可行的吗?