合并排序的开放区间中点

时间:2015-02-22 15:44:00

标签: java python c++ c

根据我的算法书,这个合并排序的闭合间隔版本已经正确实现了。但是,我想设置此排序算法的开放式间隔版本。这样做的正确方法是什么?这是我目前的封闭区间代码:

#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实现。

1 个答案:

答案 0 :(得分:0)

对于&#34;开放式结束&#34;,您使用mid而不是mid + 1,并检查&lt;高指数而不是&lt; =高指数。

在这个帖子中有一些优化的自上而下和自下而上的合并排序的例子,它们都是&#34;开放式的&#34;。两个示例都传递了第二个数组以用于合并排序(与自上而下的方法相反,动态分配,复制和释放子数组,这明显更慢)。

merge_sort using vectors works well with less than 9 inputs