本系列前几课分别介绍了算法的常用设计模式、建立数据模型的常用思路和方法。其实,用代码实现的算法肯定还会包含一些代码特有的技巧,这一课就来介绍一些这样的技巧。这些巧妙构思的代码技巧,有些体现了效率,有些体现了程序设计的一致性原则,有些则体现了软件架构的一些好思想;这些技巧,都可以在今后的算法设计中直接或间接使用,即使用不上,了解这些内容对于开阔思维还是很有益处的,更不用说其中一些技巧都是常见或不常见的面试题了。
常用技巧
哨兵位
设置哨兵位是程序设计中常用的技巧之一,常用在线性表的处理过程中,比如查找和移动数据操作。哨兵位通常起到两个作用,一个是作为一个临时存储空间使用,另一个是减少不必要的越界判断,简化算法代码复杂度。比如环形链表通常会设置一个表头节点,无论向前或向后遍历,均以这个表头节点为遍历越界(重复)的依据,这样维护链表的时候就不需要专门存储一个表头指针,这个表头节点可以理解为哨兵位。插入排序算法中也会利用表中的 0 号位置作为哨兵位使用,这个位置不仅起到一个临时存储空间的作用,还可以简化插入后移动数据的判断条件。注意下面的插入排序代码,内层 while 循环移动数据的时候,只需判断当前位置的数是否比 ls[0] 位置大即可,不需要关心 j 的位置是否小于 1 而越界,因为当 j=1 的时候,ls[j - 1] &