根据我的算法书,这个合并排序的闭合间隔版本已经正确实现了。但是,我想设置此排序算法的开放式间隔版本。这样做的正确方法是什么?这是我目前的封闭区间代码:
#include <iostream>
using namespace std;
template<typename T>
void mergeHalf(T *src, uint start, uint mid, uint end)
{
T *temp = new T[end + 1];
uint lhs = start, rhs = mid + 1;
uint index = start;
while(lhs <= mid && rhs <= end)
{
if(src[lhs] <= src[rhs])
temp[index] = src[lhs++];
else
temp[index] = src[rhs++];
index++;
}
while(lhs <= mid)
temp[index++] = src[lhs++];
while(rhs <= end)
temp[index++] = src[rhs++];
for(index = start; index <= end; ++index)
src[index] = temp[index];
delete [] temp;
}
template<typename T>
void merge(T *src, uint start, uint end)
{
if(start < end)
{
// Add one to midpoint to even out size division
const uint m = start + (end - start) / 2;
merge(src, start, m);
merge(src, m + 1, end);
mergeHalf(src, start, m, end);
}
}
int main()
{
const size_t n = 6;
int myArray[n] = {5, 2, 3, 1, 7, 9};
merge(myArray, 0, n - 1);
for(size_t i = 0; i < n; ++i)
cout << myArray[i] << ' ';
cout << endl;
return 0;
}
我试图改变这种合并排序算法以使用开放式范围,即调用merge(myArray,0,n);而不是合并(myArray,0,n - 1);
编辑:截至目前,当我传入数组大小并将循环更改为开放式(不包含)时,中点递归出现问题。我一直试图追踪这个问题,但我根本看不到它。
感谢阅读,非常感谢任何帮助;此外,标签中列出的任何语言都可以。该算法在C ++ 11中使用GCC 4.9.2实现。
答案 0 :(得分:0)
对于&#34;开放式结束&#34;,您使用mid而不是mid + 1,并检查&lt;高指数而不是&lt; =高指数。
在这个帖子中有一些优化的自上而下和自下而上的合并排序的例子,它们都是&#34;开放式的&#34;。两个示例都传递了第二个数组以用于合并排序(与自上而下的方法相反,动态分配,复制和释放子数组,这明显更慢)。