算法
硅基憨憨
这个作者很懒,什么都没留下…
展开
-
回溯算法
问题特征 可拆分成多个步骤解决 – 每个步骤解决的问题相似 求所有解 以1,2,3全排列为例 第一步:从1,2,3中选一个数放到第一位 第二步:从剩余数字中选一个数放到第二位 第三步:将剩下的数字放到第三位 此时得到了该问题的一个解 并且没有其他选择可以产生其他解 但在第二步中还有一个选择可以产生新的解 回溯到第二步 选择另一个数字放到第二位,第三部将剩下的数字放到第三位 此时再回溯到第二步已经不能产生新的解了,继续向前回溯到第一步。。。 思考 因为每一步解决的问题相同 所以可以抽象出一个函数 back原创 2020-09-09 20:53:23 · 661 阅读 · 0 评论 -
深度优先遍历(DFS)&广度优先遍历(BFS)
深度优先遍历(Depth First Search) 特点 以观看b站视频为例 深度优先遍历是看完一个视频(视频a)后点击推荐视频的第一个(视频b),看完视频b后,再点击视频b推荐列表的第一个,……,假如不再推荐视频了,返回上一个视频,点击推荐视频的第二个…… 广度优先遍历 特点 广度优先遍历是看完当前视频(视频a)后点击推荐视频的第一个(视频b),看完视频b后返回视频a的推荐列表,将视频b记下,...原创 2020-03-04 09:40:40 · 127 阅读 · 0 评论 -
排序算法09-桶排序 Python实现
桶排序,主角当然是桶了 桶就是一个列表,存放的是一个范围内的数,同时还是有序的 桶排序需要的是一组桶, 桶之间的范围连续且相等,比如第一个桶范围是10-19,第二个桶的范围就是20-29 这些桶的范围正好包括需要排序的数 其中我们能知道的就只有列表中数的范围(max-min+1)加一的目的是防止越界,桶的个数需要自定义(n), 然后就能算出桶的范围了 遍历列表,计算出a[i]应该放入...原创 2019-04-12 21:09:17 · 360 阅读 · 0 评论 -
排序算法08-计数排序 Python实现
计数排序所计的数是列表中小于等于当前数的个数 a:要排序的列表 b:计数列表 c:存放排序结果的有序列表 max:a中的最大值 计数排序需要额外两个列表,其中b长度为max+1,因为其元数b[n]的含义为:原列表中小于等于n的数的个数 所以该算法的缺点就很明显了,党要排序的数都很大时,或者这些数之间距离很远时会浪很多存储空间 具体过程 既然需要一个max+1长度的列表,那就需要知道m...原创 2019-04-11 08:41:37 · 159 阅读 · 0 评论 -
排序算法07-堆排序 Python实现
堆分为大根堆和小根堆 大根堆是一颗完全二叉树,且根节点大于所有子节点,每棵子树也是大根堆 堆排序要做的就是(1)先把列表构造成一棵二叉树,然后将这棵二叉树调整成大根堆 (2)然后将根节点与最后一个子节点交换,删掉最后一个子节点(并不是真的删掉,只是下次排序不带它) (3)将剩下的二叉树重新调整成大根堆 重复(2)(3)直到堆为空 关于构造大根堆和调整大根堆的过程可以参考这个神奇的网站 ...原创 2019-04-10 16:59:09 · 138 阅读 · 0 评论 -
排序算法06-归并排序 Python实现
归并可以理解为递归-合并,虽然不知道名字是不是这么来的,但是这确实是归并的主要思想 合并的意思当然就是将两个数组合并成一个,我们是在排序啊,两个混乱的数组肯定不能合并成一个有序的数组 所以这一步需要做的是将两个有序的数组合并成一个有序的数组 但是我们开始只有一个数组,所以我们要把数组从中间分开,但是分开后的数组还是无序的 这个时候就该递归了,既然一开始就分开了,那就一直分下去呗,分到每一部...原创 2019-04-09 22:43:22 · 133 阅读 · 0 评论 -
排序算法05-快速排序 Python实现
设置左右指针,左指针指向第一个数,右指针指向最后一个数 取出第一个数为基准数,此时第一个位置即左指针位置空出 右指针从右向左寻找比基准数小的数,找到后放到左指针的位置,此时右指针所指位置空出 左指针从左往右寻找大于基准数的数,找到后放到右指针所指位置 循环前两步,直到左指针等于右指针,将基准数放到左右指针所指的位置 此时,数列被分成了三部分,左指针左边的数(全部小于基准数),右指针右边的...原创 2019-04-08 11:22:27 · 166 阅读 · 0 评论 -
排序算法10-基数排序 Python实现
基数排序是从低位到高位按某一位来排序 所以需要知道列表中的最大值,以获取它的位数,确定循环的次数 每次循环需要建一个长度为10的列表,元素为空列表,下标对应每个数的某一位 即第一次循环,如果某个数个位为3,则放入下标为3的列表中 第二次循环,按十位进行 每次循环结束,遍历二维列表,将元素依次赋给原列表,即第一次循环结束后,得到了个位有序的列表 第二次循环结束,得到个位和十位有序的列表 ...原创 2019-04-14 16:10:44 · 294 阅读 · 0 评论 -
排序算法04-希尔排序 Python实现
希尔(shell)排序是从插入排序改进而来的 以将[9,8,7,6,5,4,3,2,1]从小到大排序为例 首先将步长设为列表长度的一半,将列表分组,得到 [9,5]一组,[8,4]一组,[7,3],[6,2],[1] 但只是这样分,实际上9和5并没有挨在一起,还在原来的位置 然后分别对每一组进行插入排序,但是中间隔着三个数,不能不管,所以每次移动的单位都是步长 将插入排序的时候,我们知...原创 2019-04-07 14:53:28 · 134 阅读 · 0 评论 -
排序算法03-插入排序 Python实现
插入排序的过程就像整理一手扑克 将列表的前半部分看成有序的,当然这部分一开始是空的,或者就只有第一个数 继续用扑克的例子来讲 从第一张开始,挑出来,放到最前边,当然这步可以不做 然后挑出第二张,和它前边的牌比较,如果前边的扑克较大,则将前边的扑克向后(右)移一张将挑出的牌放到这张扑克的位置 推广到第n张,挑出第n张扑克,依次和它前边的扑克比较,如果前边的扑克大,则后移,直到第n-i张小于...原创 2019-04-06 17:27:35 · 122 阅读 · 0 评论 -
排序算法02-选择排序 Python实现
选择排序是将整个列表分成两部分,一部分有序,一部分无序 升序以前半部分有序,后半部分无序为例 第一次遍历选择整个列表最小的的数,与第一个数交换位置,这样第一个数就是有序的,剩下的无序, 第二次遍历,从第二个开始寻找最小的数,与第二个数交换,前两个数有序…… a = [9, 78, 54, 91, 86, 53, 88, 66, 46, 15] for i in range(len(a)...原创 2019-04-05 21:26:44 · 106 阅读 · 0 评论 -
排序算法01-冒泡排序 Python实现
所谓冒泡排序,就是小的数越来越靠前,大的数越来越往后 第一次遍历整个列表,如果前一个数比后一个数大,交换位置,直到比较完最后两个数时,会将整个列表中最大的数沉到列表最后一个,所以第二次遍历就只需要遍历到第n-1个数,n为数字个数,遍历n次后得到结果 a = [9, 78, 54, 91, 86, 53, 88, 66, 46, 15] for i in range(len(a)): ...原创 2019-04-04 22:18:44 · 123 阅读 · 0 评论