【编程练习题】


  本章编程练习题中的顺序表和线性链表的类型和第9章相同。

 1. 试以 L.r[k+1] 作为监视哨改写10.2.1节中给出的直接插入排序算法。其中, L.r[1..k] 为待排序记录且 k<MAXSIZE 。
  void InsertSort(SSTable& L)
 // 对 L 中的元素按关键字递增次序进行直接插入排序("监视哨"设在表尾)

 2. 试编写如下说明的静态链表完成链表插入排序的算法。
  typedef struct
  {

   KeyType key;
  }SElemType; // 元素类型

  typedef struct
  {

   SElemType rc;
   int next;
  }SLNode; // 静态链表结点结构

  typedef struct
  {
   SLNode r[maxsize];
   int length;
  }SLinkList; // 静态链表

  void SLinkInsertSort(SLinkList &f)
 // 对静态链表 f 进行表插入排序,并调用过程 Arrange
 // 对表中记录进行调整 f.r[0].rc.key 已赋最大关键字

 3. 荷兰国旗问题:设有一个仅由红、白、兰这三种颜色的条块组成的条块序列。请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、兰的顺序排好,即排成荷兰国旗图案。
  void HFlag(SSTable &F)
 // 将顺序表 F 中的元素按关键字依次为红、白、兰的顺序排列成 3 色条块

 4. 已知(k1,k2,…,kp)是堆,则可以写一个时间复杂度为 O(logn) 的算法将(k1,k2,…,kp,kp+1)调整为堆。试编写"从 p=1 起,逐个插入建堆"的算法,并讨论由此方法建堆的时间复杂度。
  void CreateHeap(SSTable &sa)
 // 将无序序列 sa 按"往堆中逐个插入元素"的方法调整为小顶堆
 // (依关键字的大小相比)

 5. 2-路归并排序的另一策略是,先对待排序序列扫描一遍,找出并划分为若干个最大有序子列,将这些子列作为初始归并段。试写一个算法在链表结构上实现这一策略。
  void SLinkMergeSort ( SLinkList &L )
 // 对静态链表 L 按题目要求进行归并排序,并调用 Arrange 函数进行重排

 6. 序列的"中值记录"指的是:如果将此序列排序后,它是第个记录。试写一个求中值记录的算法。
  KeyType MiddleElem(SSTable L)
 // 返回在 L 中值"取中"的关键字

 
【编程练习题】