【编程练习题】
本章编程练习题中的顺序表和线性链表的类型和第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 中值"取中"的关键字
|