408考研之数据结构的排序——简单选择排序&堆排序(heapsort)

节参考王道408视频以及相关参考书,如有侵权即刻删除,仅作学习交流使用。

TIPS:堆排序heapsort是比较难理解的算法,也是考试经常涉及到的算法

选择排序:每趟待排序元素中,选取关键字最小/最大的元素加入有序子序列。

简单选择排序,算法思想:每次从待排序的关键字序列中,依次进行对比,选出一个关键字最小的元素与第一个元素进行交换,而后递归的进行前述操作,直至整个序列都有序。

总结:简单选择排序时间复杂度O(n^2),空间复杂度O(1);简单选择排序不稳定;适用于顺序表和链表;

堆排序——————heapsort

TIPS:前置知识,二叉树的顺序存储

堆:所谓的堆,从内存来看,是以数组的形式存放的。但是从逻辑的角度来看,可以理解为一颗顺序存储的完全二叉树,T[0]不存储元素,从下标第一个元素开始,存入根结点元素,它的左右孩子结点编号分别为2i,2i+1,依次类推;

重要概念:大根堆(大顶堆)——完全二叉树中,根大于左右结点;这与二叉排序树需要区分开来:BST二叉排序树的规则是左子树<根结点<右子树;小根堆——完全二叉树中,根小于左右结点;

对于一个给定的关键字序列,要把它排列成小/大根堆的这一步骤,称为建堆操作。

建堆需要关注的点:

    1,长度为n的序列,对应数组a[],同时对应n个结点的完全二叉树;需要对(n/2)向下取整的元素下标,进行关键字的比较;比较的数组下标范围为:a[1]~a[(n/2向下取整)]。

    2,从a[(n/2向下取整)]往前按顺序检查所有分支节点,若要建立大根堆,则让小元素不断“下坠”。

对于给定的大根堆/小根堆,进行堆排序:

堆排序最核心的运算是堆的调整操作,它通过调整结点位置使序列保持堆的性质,即:堆顶元素与堆底元素交换位置后,让新的根结点不断“下坠”,重新达到大根堆的要求,此时通过一次堆排序确定了一个关键字,接下来重复上述步骤即可。

堆的插入与删除

    堆的插入

        1,将新插入结点放入数组末端,也就是堆的末端;

        2,新元素与父节点进行比较,若小于父节点,则结束;若大于父节点,则将新元素与父节点互换,继续重复2。

key:大根堆的插入,新元素一定插入堆底,插入后新元素一定不断“上升”;

    

    堆的删除

        1,删除元素后,用堆底元素代替被删除结点;

        2,堆底元素不断进行“下坠”,直到符合大根堆/小根堆的要求。

总结1:堆排序空间复杂度为常数级,O(1);时间复杂度为O(nlog2 n);堆排序不稳定,且只适用于顺序表。

总结2:堆排序的插入与删除中,对于关键字的比较需要重点关注,考研经常容易考选择题———当堆排序进行删除后,堆底元素填充到删除位置,同时还要满足大/小根堆的要求,所以需要堆元素进行"下坠操作",需与儿子结点进行比较,如果儿子结点有1个就比较1次,有俩个就比较俩次;

当堆排序进行插入后,默认插入到堆底,此时需要将堆底元素“上升”,以满足大/小根堆的要求,所以需要与父节点进行比较,而不需要与兄弟结点比较(大/小根堆的定义是跟结点大/小于左右孩子,不需要左右孩子进行大小比对),这需要与删除操作区分开(删除操作是下坠,需要将替补上来的元素与俩孩子都做对比,从而找出大的关键字进行替换)。

    选择答案:C,B。

个人解释如下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值