确定以下函数是否确定数组是否按升序排序
Determine whether the following function determines if array is sorted in ascending order
我试图跟踪这个递归调用,但我认为它决定数组是否按升序排序的假设是不正确的。关于我该怎么做,有什么建议吗?
bool g(int a[], int l, int r) {
if(l==r)
return true;
if((r-l)==1)
return (a[l] > a[r]);
else {
int m = (l+r)/2;
return (a,l,m) && (a[m] > a[m+1]) && g(a,m+1,r);
}
}
最后一个返回行应该是:
return g(a,l,m) && (a[m] > a[m+1]) && g(a,m+1,r);
如果您只编写(a,l,m)
,C++将其视为逗号运算符,其结果只是最后一个参数(在您的情况下为m
,它大多是"true",并防止对其他任何内容进行求值)。
带您了解如何分析:
g()
处理int数组- CCD_ 4和CCD_
l
==r
是终止条件。。。始终返回true
r - l == 1
意味着r
预计将多于l
,巩固了对它们的理解,即数组中范围的左(下索引)和右端:如果l
和r
并排,则a[l] > a[r]
检查降序m = (l + r) / 2
-这是在左端和右端之间找到一个中点,但至关重要的是如果l + r
是奇数,它会向下四舍五入,所以我们在理解算法时最好考虑这种"边缘情况"- 返回语句。。。
- 正如kvark在他的回答中所说,它肯定是
g(a,l,m)
。。。这意味着在范围CCD_ 18上进行相同类型的处理 - 递减顺序的
&& a(m) > a[m+1] &&
测试 g(a, m+1, r)
对范围m+1..r
执行相同类型的处理
- 正如kvark在他的回答中所说,它肯定是
所以。。。当r-l>1时,需要考虑2个或更多个元素。如果我们从最小的差距开始,而不是特殊情况(2),并通过更大的差距,直到我们建立了一个明显的趋势,即依赖于已证明有效的较小差距:
- 如果r-l==2:m=1,则解析为
g(a,l,l+1)
(测试a[l]>a[l+1])&& a[l+1] > a[l+2] && g(a,l+2,l+2)
(后者始终为真),因此两个重要的测试是a[l] > a[l+1] > a[l+2]
(使用数学语义) - 如果r-l==3:m=1,如上所述,除了最后一个递归调用变为
g(a,l+2,l+3)
,它将测试a[l+2] > a[l+3]
,因此它可以确保它们都是有序的 - 如果r-l==4,m=2,解析为
g(a, l, l+2)
(我们在上面证明了它是有效的)&& a[l+2] > a[l+3] && g(a,l+3,l+4)
(最后,r-l == 1
,我们在上面也观察到了它的有效性)
很明显,当r-l==5 g()
重复测试2和3的r-l间隙(如上所述),6测试3和3,7 4和3等……所以我们可以看看是否适用于任何大小的r-l缝隙。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 无论条件是否为true,if总是在c++中执行
- 如何检查 2D 数组在 c++ 中是否按升序排列?
- 如何确定数字是否具有从右到左升序的数字
- 确定以下函数是否确定数组是否按升序排序
- 数组是否升序
- std::set迭代顺序是否始终根据C++规范升序
- 如何打印这个数组的四个角?我怎么知道这些列是否是严格升序的
- OpenMP循环中的索引是否按升序处理
- 如何用C++编写一个程序,该程序从输入中接收10个数字并检查这些数字是否按升序排列