例5.3 将正数N插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有数均为正数且已按递增的次序排列。

  由于数组的首地址和末地址都是已知的,因此数组长度是可以确定的。但是,这里只要求插入一个数,并不一定要扫描整个数组,所以可以用找到应插入数的位置作为循环的结束条件。此外,为空出要插入数的位置,其前的全部元素都应前移一个字(即向地址增大的方向移动一个字,这里的前后是指程序运行的方向为前,反之则为后)。所以算法上应该从数组的尾部向头部查找,可逐字取出数组中的一个数K与N作比较,如K > N,则把K前移一个字,然后继续往后查找;如K £ N,则把N插在K之前就可以结束程序了。

  在考虑算法时,必须把可能出现的边界情况考虑在内,这个问题是初学者易于忽略的,应该引起注意。

  在例5.3中,应该考虑N 大于或小于数组中所有数的两种可能性。如果N大于数组中所有数,则第一次比较就可以结束循环,也就是说循环次数有可能等于0,所以应该选用DO_WHILE结构。如果N小于数组中所有数,则必须使循环及时结束,也就是说不允许查找的范围超过数组的首地址,这当然可以把数组的首地址也同时作为结束条件来考虑,或者同时用循环次数作为结束条件之一来考虑。本例的更好办法是:可以利用所有数均为正数的条件,在ARRAY_HEAD-2单元中存放'-1',这样可以保证如果数N小于数组中所有数,那它必然大于 -1,这样就可以正确地把N放在数组之首了,循环的结束仍然可以使用K>N这一条件。根据上述有关算法的考虑可画出程序如动画所示。