《数据结构》第八章算法设计题--排序


本系列主要为了记录在江财的暑期小学期中的刷严蔚敏、李冬梅、吴伟乐版《数据结构 c语言第2版》的算法设计题,主要包括三部分内容,第一部分为对不熟悉的知识点重新回顾总结,第二部分为算法设计题的代码,第三部分为刷题总结;共勉 💪

回顾部分不熟的知识点

1、堆排序
  1. 堆排序中的堆是基于顺序存储的完全二叉树的中双亲节点和叶子节点之间的内在关系建立;(a[i] 的左孩子是 a[2i],右孩子是 a[2i+1])
  2. 堆排序只能用于顺序结构;
  3. 堆排序不稳定;
  4. 初始建堆所需的比较次数较多,所以堆排序适用于数据量较多时的排序,

刷题部分

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;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值