本周的内容又是一次延续上一周学习内容掌握新知识的过程,本周学习了一种特殊形式的树——堆,学习了两种实现堆的方法:用链表实现和用数组实现,同时还学习了使用堆来实现一种特殊队列——优先队列以及基于堆实现的另外一种排序方法:堆排序。html
6
,它和它的右孩子9
与堆的附加属性二冲突,因此将二者进行交换。4
,它比它的两个孩子都小,因此与其中较大的9
进行交换,而在交换以后,4
与它新的左孩子5
和右孩子6
进行对比,仍然与堆的附加属性二冲突,因此再次对4
和6
进行交换操做。lastNode
来存储最末结点。addElement
lastNode
指针再次指向最末的结点,该步的时间复杂度为O(1)。getNextParentAdd
(用于返回插入结点如今的父结点)和heapifyAdd
(从该结点开始,对剩余堆进行从新调整直至根处)。removeMin
getNewLastNode
(用于返回最末结点的引用)和heapifyRemove
(从根结点开始,对下面的堆进行从新调整直至叶子结点)。addElement
heapifyAdd
(在必要时,从该结点开始,对剩余堆进行从新调整直至根处)。removeMin
heapifyRemove
(在必要时,对下面的堆进行从新调整直至叶子结点)。addElement
方法)的时间复杂度为O(logn),所以n个结点的时间复杂度为O(nlogn)。在删除操做中,每个元素的删除操做(即便用removeMin
方法)的时间复杂度也为O(logn),所以删除n个结点的时间复杂度为O(nlogn)。因此堆排序的时间复杂度为O(nlogn)。9
与最末结点4
进行交换,而后将9
输出;对于剩下的部分,重新的根结点开始,4
比它的左右孩子都小,所以与两者之间较大的8
进行交换,交换后4
变为叶子结点,开始进行下一步操做。ArrayHeap
类,为了查看堆的构造而改为了LinkedHeap
类,可是从树的结构来看就算使用层序遍历它也依旧不是按照元素进入队列的顺序排列的。代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10/10 | 1/1 | 10/10 | |
第二周 | 246/366 | 2/3 | 20/30 | |
第三周 | 567/903 | 1/4 | 10/40 | |
第四周 | 2346/3294 | 2/6 | 20/60 | |
第五周 | 2346/3294 | 2/8 | 30/90 | |
第六周 | 1343/4637 | 2/8 | 20/110 | |
第七周 | 654/5291 | 1/9 | 25/135 | |
第八周 | 2967/8258 | 1/10 | 15/150 |