关于《Java数据结构和算法》中的小问题

关于《Java数据结构和算法》中的小问题

今日无聊,重翻《Java数据结构和算法》,在重翻"冒泡排序"一章时,对于demo思来想去,还是总觉得有一丢丢问题,因此在这里进行记录以防后续入坑:

其中外层循环原码为:

for (int out=nElems-1; out>1; out--) {           // 问题处

    for (int in=0; in<out; in++) {

         // ####

    }

}

其原demo数组列表为[77, 99, 44, 55, 22, 88, 11, 00, 66, 33]

问题就出现在这里的out>1处,因为demo给出的数组列表为特殊情况,所以运行其原始demo看起来是无问题的。但是,让我们抱着怀疑的态度来进行稍作修改:

第一步:我们不更改for遍历条件,而来更改数组

              a) 我们去除后5个元素

              b) 我们去除后4个元素

              这时候我们发现 a) 方式测试结果是错误的,但 b) 方式测试结果是正确的,那是否是这种for遍历条件和数组元素的奇偶个数有关系呢?暂且我们不进行评价,尝试下面 c)  d) 更改方式

              c) 我们去除后2个元素

              d) 我们去除倒数2~4元素,留下前6个和后2个元素

              这时候我们发现 c) 结果是错误的,但是 d) 结果却是对的,这里原因需要我们查看遍历步骤结果,推断发现:在第4步,c) :22 44 11 00            d) :22 44 55 33 这种情况下,再次进行冒泡处理时结果将发生画风般的转折,在这种循环6次的前提下,c) 下一步后变为 22 11 00 44,d) 变为 22 44 33 55,这样我们就可以理解了,对于这种情况,第6步的 c) 场景需要同时处理22 11互换和11 00呼唤,是无法实现的,但 d) 只需要处理44 33呼唤,所以 c) 是错误的,d) 是正确的。

              综上情况,demo程序是否通用所有冒泡场景,难听点就是听天由命。

第二步:我们更改for遍历条件,而不更改数组

               应该老老实实将 "问题处" 遍历条件改为 

               for (int out=nElems-1; out>0; out--) { }  // 将out>1 =》out>0

               这样,就不会出现以上异常情况了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值