|  |  例2-10 编写算法删除有序顺序表中"多余"的数据元素,即使操作之后的有序顺序表中所有元素的值都不相同。 
 
  算法2.24 void purge_OL(SqList &L )
 {
 // 
      删除有序顺序表L中的冗余元素,即使操作之后的有序顺序表中
 // 只保留操作之前表中所有值都不相同的元素
 k = -1;            // 
      k 指示新表的表尾
 for (i=0; i<L.length-1; ++i) // 
      顺序考察表中每个元素
 {
 if ( k==-1 || L.elem[k]!=L.elem[i])
 L.elem[++k] = L.elem[i]; // 
      在新表中不存在和L.elem[i]相同的元素
 } // for
 L.length = k+1;        // 
      修改表长
 } // purge_OL
 
 显然,此算法的时间复杂度为O 
      (ListLength(L))。
 |  | 解题分析: 仍采用例2-6的算法思想,存储结构也相同,所不同的仅是"如何判别在"新表"中是否存在和当前考察的元素相同的元素"。
 由于在有序表中的数据元素是依值从小到大依次排列的,则"相同的"元素必定连续排列在一起,因此,如果"新表"中已存在和当前考察的元素相同的元素,那必定是"新表"中的最后一个元素。由此,不需要在"新表"中从头至尾地查询,而只需要和"新表"中当前最后一个元素比较即可。
 
 例如:(2,2,3,3,3,4,4,5,5,5,5,7)经操作后变成(2,3,4,5,7)
  
 读者可以对算法2.21进行改写,同样可以得到一个时间复杂度为O 
      (Listlength(L)) 的算法,但必须注意,应将当前考察的元素插入在"新表"的表尾,以保持链表的有序性。
   前面已经谈到,例2-6和例2-9是例2-2的算法在不同存储结构上的实现,例2-10则可以看成是对例2-2的同样问题,由于采用了不同的数据结构(有序表),因而有了不同的算法。
 从这个例子可以看到"有序表"优越性。
 |  |