本系列主要为了记录在江财的暑期小学期中的刷严蔚敏、李冬梅、吴伟乐版《数据结构 c语言第2版》的算法设计题,主要包括三部分内容,第一部分为对不熟悉的知识点重新回顾总结,第二部分为算法设计题的代码,第三部分为刷题总结;共勉 💪
回顾部分不熟的知识点
1、堆排序
- 堆排序中的堆是基于顺序存储的完全二叉树的中双亲节点和叶子节点之间的内在关系建立;(a[i] 的左孩子是 a[2i],右孩子是 a[2i+1])
- 堆排序只能用于顺序结构;
- 堆排序不稳定;
- 初始建堆所需的比较次数较多,所以堆排序适用于数据量较多时的排序,
刷题部分
8.3.1
//以单链表为存储结构的选择排序
void SelectSort_linklist(linklist& l) {
linknode *p = NULL,//p用来指向以排序好的链表节点
*q, //q为每趟遍历的指针
*max,//max用来指向每趟遍历时的较大节点的前趋节点
*temp;//temp为插入时使用的临时指针
while (l->next != NULL) { //外层循环,每趟循环都从原列表中找出最大的节点,链表为空时结束
q = l->next;
max = l;
while (q->next!=NULL) { //内层循环,找剩下的无序原链表中的最大节点
if (max->next->data < q->next->data) {
max = q;
}
q = q->next;
}
//取出无序链表中的最大节点
temp = max->next;
max->next = max->next->next;
//将最大节点头插入有序链表
temp->next = p;
p = temp;
}
l->next = p;
}
//习题答案找出最小节点,然后再交换节点值,并不移动节点;而我写的方法是移动节点,适用于大容量链表节点的排序
//以下是答案册上的答案:
void LinkedListSelectSort(LinkedList head)
p=head->next;
while(p!=null){
q=p->next; r=p; //设r是指向关键字最小的结点的指针
while (q!=null){
if(q->data<r->data) r=q;
q=q->next;
}
if(r!=p) r->data<-->p->data;
p=p->next;
}
}