警惕无限递归

二分

  今天在做二分类型题时,再次遇到了令人恶心的“特殊情况”引发的无限递归,因此写此文章警示自己。
对于数组 [2, 1, 3, 4, 5]
当我将其通过如下方式二分时:

int quick_sort(int l, int r)
{
    if (l >= r) return a[l];
    int i = l - 1, j = r + 1, x = a[l + r >> 1];
    while (i < j){
        do i ++; while(a[i] < x);
        do j --; while(a[j] > x);

        if (i < j) swap(a[i], a[j]);
    }

    if (j > k) return quick_sort(l, j - 1);
    else return quick_sort(j, r);
}

将容易出现无限递归的情况;如:
递归后 (k = 3)
(1) j = 3, 数组 [3, 4, 5]
(2) j = 3, 数组 [3, 4, 5]
(3) j = ……, 代码将无休止的运行

正确代码:

// 改变判断条件(原因等我学过二分了再详细讨论)
if (j >= k) return quick_sort(l, j);
else return quick_sort(j + 1, r);

同样的, 可以对二分代码进行改进

if (i < j) 
{
	swap(a[i], a[j]);
    i ++, j --;
}
// 这样递归结束后也不会出现无限递归的问题
全部评论

相关推荐

10-14 21:00
门头沟学院 Java
吃花椒的狸猫:这个人说的倒是实话,特别是小公司,一个实习生哪里来的那么多要求
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务