确定以下函数是否确定数组是否按升序排序

Determine whether the following function determines if array is sorted in ascending order

本文关键字:是否 升序 排序 数组 函数 确定以      更新时间:2023-10-16

我试图跟踪这个递归调用,但我认为它决定数组是否按升序排序的假设是不正确的。关于我该怎么做,有什么建议吗?

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,巩固了对它们的理解,即数组中范围的左(下索引)和右端:如果lr并排,则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执行相同类型的处理

所以。。。当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缝隙。