归并排序(Merge-Sort)中first是否可能大于last?>=判断的>是否冗余?
归并排序边界判断相关问题解答
给出的归并排序伪代码如下:
MERGE-SORT(a[], first, last) { if first >= last return mid = first + (last - first) / 2 MERGE-SORT(a, first, mid) MERGE-SORT(a, mid + 1, last) MERGE(a, first, mid, last) }
1. 正常调用流程是否会出现first大于last的情况?
如果初始调用符合规范(非空数组传入的first为数组起始下标、last为数组末尾下标,满足first <= last),且伪代码递归逻辑没有被修改的前提下,递归过程不会出现first > last的场景。
推导很简单:只有当前调用满足first < last的时候,才会走到递归分支。计算得到的mid最小等于first,最大等于last - 1,所以两次递归的参数分别是[first, mid](满足first <= mid)、[mid+1, last](满足mid+1 <= last),所有递归调用的参数都符合first <= last,不会出现first比last大的情况。
2. 条件里的>符号是不是没有实际作用?
不是,这个符号有明确的实用价值,原因如下:
- 首先是防御性编程的需求:如果调用方传参错误,比如初始调用时颠倒了
first和last的顺序,或者处理空数组的场景下,first > last的判断可以直接触发返回,避免后续计算mid、递归调用等逻辑触发数组越界、死递归等异常。如果只有first == last的判断,遇到传参错误的场景代码就会直接出错。 - 其次是容错性需求:如果后续修改代码的时候不小心写错了递归参数,比如把第二个递归调用写成了
MERGE-SORT(a, mid + 2, last),>=的判断也能快速拦截异常场景,不会让问题放大。
简单说,>=的判断相比==,没有额外的性能开销,还能提升代码的鲁棒性,完全不是多余的设计。
内容的提问来源于stack exchange,提问作者Qosay Al-Shatel
相关产品推荐
相关产品推荐

