如何编写合并排序但除以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);
}
答案 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);
}