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

C++ Merge Sort Algorithm for use with arrays of variable size

本文关键字:数组 用于 合并 排序 算法 C++      更新时间:2023-10-16

我遇到了麻烦,在花了几个小时在线搜索如何进行合并排序并遵循我找到的算法后,我得到了这个问题,它产生了一个堆栈溢出错误,我似乎无法跟踪

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;
}

当最初调用时,下限为1,数组为持有int的T类型,上限为用户确定大小的

编辑:在根据评论进行了一些编辑之后,这就是我所拥有的,但元素没有被排序。

template <class T>
void mergeSort(T 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);
    }
}
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;
}

Okkk。。因此,在您对注释进行了所有更改之后,我认为唯一的问题是来自主函数的mergesort调用。我相信您的mergesort调用看起来类似于mergeSort(list,1,5)(对于大小为5的数组)。尝试将其更改为mergeSort(list,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;
}

main看起来应该是这样的::

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;
}

我只是去掉了template部分,因为我对它不太熟悉。但是,我认为这不会有多大区别。

这是执行代码的视频链接:http://ideone.com/40wFkI

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

希望这能有所帮助。:)