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;i if(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:
函数是不可行的吗?