摘要:回顾一下我们学过的选择排序,在无序区找到一个最小(大)的元素需要比较n 1次,找到第二小的元素需要比较n 2次,直到最后比较1次。而堆排序因为二叉堆的性质,堆顶就是最大的元素,查找次数只有一次,但是将无序转成有序中间还需要一个预处理过程:构造堆有序。 堆有序并不代表数组有序,堆有序是满足二叉堆性质的 阅读全文
posted @ 2019-12-19 15:41 我脱下短袖 阅读 (293) 评论 (0) 编辑
摘要:希尔排序属性 上篇写的直接插入排序算法时间复杂度是O(n^2),如果要令此排序算法的时间复杂度要低于O(n^2),必须是“远距离的元素交换”使得这组元素能提高有序的程度,然后进行直接插入排序的时候可以减少交换的工作量。 那通过什么减少交换的工作量呢?希尔排序可以解决这个问题。 希尔排序在做直接插入排 阅读全文
posted @ 2019-12-17 13:04 我脱下短袖 阅读 (318) 评论 (0) 编辑
摘要:学过上一篇文章的计数排序之后,特别是归约化分治处理的计数排序(适用于较离散的非负整数序列)。计数排序的局限比较多,在排序之前需要解决负数和小数的问题,而桶排序不需要考虑这些。 桶排序和计数排序一样,不受O(nlogn)时间复杂度下限的影响,它将待排序序列通过遍历方式分到有限数量的桶中,然后每个桶被单 阅读全文
posted @ 2020-01-27 14:46 我脱下短袖 阅读 (16) 评论 (0) 编辑
摘要:我们知道快速排序的时间复杂度期望值是O(nlogn),其中O(logn)是利用了二分法进行远距离比较和交换元素的位置。如果不去做比较交换计算,有没有可能有一种算法,它的时间复杂度期望值能降低到O(n)线性时间呢? 我们可以有这样的思路,对于任何一个待排序数组的元素x,如果知道了待排序数组中有多少个元 阅读全文
posted @ 2020-01-27 14:44 我脱下短袖 阅读 (12) 评论 (0) 编辑
摘要:归并排序的归并这两个字和递归没有关系,归并是将两个有序的数组归并成一个更大的有序数组,但整个排序算法是有可能跟递归有关系的。因为归并排序算法可以按照递归方式去解决,也可以按照迭代方式去解决。 递归方式是自顶向下的归并排序,迭代方式是自底向上的归并排序。这两种归并排序虽然实现方式不同,但是都是调用了核 阅读全文
posted @ 2020-01-27 14:40 我脱下短袖 阅读 (8) 评论 (0) 编辑
摘要:基数排序和计数排序一样无需进行比较和交换,和桶排序一样利用分布和收集两种基本操作进行排序。基数排序是把每一个元素拆成多个关键字,一个关键字可以在每一个元素上同等的位置进行计数排序,一个元素拆成多个关键字可以看作是要进行几轮分桶,以一个元素最长的长度为准。 基数排序可以看成多(单)关键字的排序,可以想 阅读全文
posted @ 2020-01-27 11:12 我脱下短袖 阅读 (22) 评论 (0) 编辑
摘要:二分搜索树又名有序二叉查找树,它有一个特点是左子树的节点值要小于父节点值,右子树的节点值要大于父节点值。基于这样的特点,我们在查找某个节点的时候,可以采取二分查找的思想快速找到这个节点,时间复杂度期望值是为O(log n),但是它有最坏的的情况下。 例如,输入数组[9,7,5,3,1],如果要满足二 阅读全文
posted @ 2020-01-27 10:57 我脱下短袖 阅读 (45) 评论 (0) 编辑
摘要:我们回忆一下AVL树,它在插入和删除节点时,总要保证任意节点左右子树的高度差不超过1。正是因为有这样的限制,插入一个节点和删除一个节点都有可能调整多个节点的不平衡状态。频繁的左旋转和右旋转操作一定会影响整个AVL树的性能,除非是平衡与不平衡变化很少的情况下,否则AVL树所带来的搜索性能提升不足以弥补 阅读全文
posted @ 2020-01-26 14:28 我脱下短袖 阅读 (33) 评论 (0) 编辑
摘要:学习过2 3树之后就知道应怎样去理解红黑树了,如果直接看「算法导论」里的红黑树的性质,是看不出所以然。我们也看看一颗二分搜索树满足红黑的性质: 1.每个节点或是红色的,或是黑色的; 2.根节点是黑色的; 3.每个叶子节点(NIL)是黑色的; 4.如果一个节点是红色的,则它的两个子节点都是黑色的; 5 阅读全文
posted @ 2020-01-26 14:24 我脱下短袖 阅读 (38) 评论 (0) 编辑
摘要:画了一系列树的动画,从二分搜索树,到AVL树,再到2 3树,再到基于2 3树的红黑树,都可以发现这些树都跟二叉查找树很像啊。 嘿嘿!二分搜索树就是二叉查找树;AVL树也是一颗二分搜索树,只多了高度差的限制;2 3树虽满足二分搜索树的性质,但不是一颗二分搜索树,2 3树由2 节点和3 节点组成的,满足 阅读全文
posted @ 2020-01-26 14:16 我脱下短袖 阅读 (22) 评论 (0) 编辑
摘要:今天分享一个LeetCode题,题号是1038,标题是:从二分搜索树到更大和数。 题目描述 给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 1)节点的左子树仅包含键小 阅读全文
posted @ 2020-01-23 13:14 我脱下短袖 阅读 (58) 评论 (1) 编辑
摘要:创建与输入数组相等长度的新数组,作为直接寻址表。两数之和的期望是Target,将Target依次减输入数组的元素,得到的值和直接寻址表比较,如果寻址表存在这个值则返回;如果不存在这个值则将输入数组中的元素插入寻址表,再进行输入数组中的下一个元素。 再进一步优化可以将输入数组直接作为直接寻址表,控制对 阅读全文
posted @ 2020-01-23 12:55 我脱下短袖 阅读 (321) 评论 (2) 编辑