使用除法3在c ++中合并排序

时间:2015-10-31 19:44:35

标签: sorting mergesort

如何编写合并排序但除以3

int merge_sort(int input[], int p, int r)
{
    if ( p >= r )
        return 0; 

    int mid = floor((p + r) / 2);
    merge_sort(input, p, mid);
    **merge_sort(input, mid + 1, r);** 
    merge(input, p, r);
}

1 个答案:

答案 0 :(得分:0)

这可能是3路合并。您可能需要考虑使用bottom up merge sort。对于自顶向下或自底向上合并,大多数复杂性将在合并函数中。正如zwergmaster链接的答案中所提到的,它是运行的3路合并。每次运行都需要当前和结束索引或指针。 if / else语句的序列最后做两个比较以确定3个运行中的哪个具有最小元素,然后将该最小元素移动到目标数组(或向量或...),并且该运行的下一个元素是检索。当达到3次运行之一的结束时,代码切换到2路合并。到达下一次运行结束时,代码将复制剩余的剩余运行。然后合并下一组3个运行,重复该过程,直到到达数组的末尾,这可能发生在3个运行中的任何一个中,因此靠近数组末尾的最后一个合并可能是3或2的合并运行,或只是1次运行的副本。

使用初始函数分配与要排序的数组大小相同的临时数组会更有效,然后让它调用合并排序函数将temp数组作为参数传递,而不是不断地分配和释放合并排序过程中的小临时数组。

因此,使用自上而下合并排序部分代码来帮助解释:

merge_sort(int *a, int n)
{
    int *b = new int[n];
    top_down_merge_sort(a, b, 0, n);
    /* ... */
    delete[] b;
}

top_down_merge_sort(int *a, int *b, int beg, int end)
{
    if(end - beg < 3){
        /* sort in place */
        return;
    }
    int run0 = beg;
    int run1 = beg +   (end-beg)/3;
    int run2 = beg + 2*(end-beg)/3;
    top_down_merge_sort(a, b, run0, run1);
    top_down_merge_sort(a, b, run1, run2);
    top_down_merge_sort(a, b, run2, end);
    merge_runs(a, b, run0, run1, run2, end);
}