C++合并排序算法,用于可变大小的数组
C++ Merge Sort Algorithm for use with arrays of variable size
我遇到了麻烦,在花了几个小时在线搜索如何进行合并排序并遵循我找到的算法后,我得到了这个问题,它产生了一个堆栈溢出错误,我似乎无法跟踪
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
这对我来说似乎很好。如果有什么问题,一定要告诉我。
希望这能有所帮助。:)
相关文章:
- 并行用于C++17中数组索引范围内的循环
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 用于 progmem 的C++和头文件压缩的 Web 文件字节数组
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- C++ 用于在数组中打印字符串的随机数
- 如何使函数返回数组?用于制作在VB.NET中使用的DLL
- std::array与C样式数组用于连续内存
- 如何使用 WIN RPC 发送终止的字符数组(用于将图像从客户端上传到服务器)
- TensorFlow C :将数组用于feed_dict
- 将一个函数中声明的数组用于另一个函数
- 链表与动态数组用于使用向量类实现堆栈
- 将数组用于函数输入参数
- 矢量与数组用于大量元素
- 多维数组 - 用于在C++中存储非常大的 2D 数据的数据结构
- 有没有更好的方法可以通过模板用预先计算的值填充数组(用于运行时)