if(i>j) break是否可行?
来源:2-3 实现双路快速排序法
慕圣3002577
2021-06-29 21:43:33
2回答
首先,是的,= 去掉可行。
=============
关于这类算法书写的细节,我印象里之前在其他问答里也聊过,找了一圈儿没找到,再简单说一下。
简单来说,我个人的风格是更强调,在书写算法的时候,靠“语义”去写,也就是你想要完成的逻辑是怎样的,而不是“尽量去除所有逻辑冗余”。除非取出逻辑冗余意味着显著的优化。
另一个例子是归并排序中,其实递归的终止条件不需要写 if(l >= r) return;if(l == r) return; 就好。我们的逻辑不会出现 l > r 的情况。
但写上 l > r,也就是判断 if(l >= r) 是否冗余?从逻辑上,冗余;但从语义上,不冗余。l > r 的时候,说明当前处理的区间为空,对于一个空区间,我们可以不排序,直接返回。这是一个合理的处理。
同理,在这个双路快排的例子里,到这个判断 break 的地方,i 停在了 >= v 的地方;j 停在了 <= v 的地方。如果 i == j,说明这两段接上,且一边 <= v,另一边 >= v,说明当前处理的部分是 == v 的,那么就不用处理了,break 就好。这是一个合理的处理。
这样想(或者这样写)有什么好处?答案是**思维负担小**。我不需要仔细地去辨别某个情况是否可能发生或者不可能发生,只根据变量的语义,去判断如果发生某种情况,怎么执行就好了。
所以,你在注释中分析的所有的内容,我都没有分析,但我肯定我的代码是正确的。而其代价,我足以承受(多判断一个 = 少判断一个 = 而已。)
当然,这是我写算法的风格和遵循的原则,你可以建立属于自己的原则。最高原则是:写出的逻辑要是正确的:)
继续加油!:)
慕圣3002577
提问者
2021-06-30
感谢老师的回答。写代码的时候,总是感觉在循环不变量特殊取值地方总是很纠结,总是感觉要分析完所有的情况,所以造成一种像您说的思维负担很重的现象。受教以后,会慢慢转变自己思维的,谢谢老师鼓励。
相似问题