Sorting 自顶向下合并排序的时间复杂性?
我知道mergesort的时间复杂度是O(nLogn),但是对于它自上而下的变体,我无法得出这个结论Sorting 自顶向下合并排序的时间复杂性?,sorting,time,merge,complexity-theory,Sorting,Time,Merge,Complexity Theory,我知道mergesort的时间复杂度是O(nLogn),但是对于它自上而下的变体,我无法得出这个结论 TopDownMerge(A[], iBegin, iMiddle, iEnd, B[]) { i0 = iBegin, i1 = iMiddle; // While there are elements in the left or right runs for (j = iBegin; j < iEnd; j++) { // If left run head exists a
TopDownMerge(A[], iBegin, iMiddle, iEnd, B[])
{
i0 = iBegin, i1 = iMiddle;
// While there are elements in the left or right runs
for (j = iBegin; j < iEnd; j++) {
// If left run head exists and is <= existing right run head.
if (i0 < iMiddle && (i1 >= iEnd || A[i0] <= A[i1]))
B[j] = A[i0];
i0 = i0 + 1;
else
B[j] = A[i1];
i1 = i1 + 1;
}
}
TopDownMerge(A[],iBegin,iMiddle,iEnd,B[])
{
i0=iBegin,i1=imidle;
//而左行或右行中有元素
对于(j=iBegin;j //如果左游程头存在且为=iEnd | | A[i0]则您屏蔽的代码只是算法的一部分:执行合并的部分。该部分的复杂度为O(n)。(logn来自算法的另一半,其中数组被反复切分为段。)
首先,让我们定义(有些神秘的)变量的含义:
iBegin
、imidle
和iEnd
表示A
的工作段。左半部分(从iBegin
到imidle
)和右半部分(从imidle
到iEnd
)都已排序并准备合并在一起
i0
是A
工作段的左侧的“下一个”变量的索引
i1
是A
工作段的右侧的一半中的“下一个”变量的索引
j
是工作数组B
中下一个空位的索引
每次通过循环时,从a
中复制一个元素,并将其放置在B
数组中j
位置。if
语句负责确定该元素是从数组的左半部分还是右半部分获取
if
语句执行(最多)三项检查:
- 如果
i0
,则在数组的左半部分仍有要处理的元素。如果为false,请转到else
块并从数组的右半部分提取元素
- 如果
i1>=iEnd
,则在数组的右半部分没有更多的元素要处理。如果这是真的,请输入If
块并从数组的左半部分获取元素
- 在数组的左右两边都必须有一些元素。比较这两个元素:如果<代码> [i0],抱歉哪种语言?有什么问题?C++,我不知道if语句运行了多少次。