趣味图解编程算法,文科生都看懂了

快速排序
快速排序是一种“分而治之”的排序算法,通过随机选择“分区点”来避免出现最坏的情况。

在这里插入图片描述

随机选择“分区点”。
按照“分区点”的高度划条线。
高出“分局点”的元素需要向右移动。
低于“分区点”的元素需要向左移动。
移动元素。
重复上述的步骤分别对位于“分区点”两边的元素进行排序

Bogo 排序
Bogo 排序也被称为“愚蠢的排序”,是一种非常简单但低效的排序算法,就是不断打乱元素的顺序,直到达到有序为止。

在这里插入图片描述

查看元素是否有序。
元素无序,那么就打乱顺序。
再次检查元素是否有序。
如果有序,排序成功,否则继续重复上述步骤。

二分查找
二分查找是一种快速从一个有序数组中找到某个元素位置的查找算法。这有点类似于猜数字游戏,通过不断问“目标数字是大于还是小于某个数”这样的问题,最终猜出目标数字。

在这里插入图片描述

限定元素区间。
待查找元素在区间的某个位置吗?
不在。
那么看看待查找元素是不是在当前位置的左边或者右边。

归并排序
归并排序也是一种“分而治之”的递归排序算法。

在这里插入图片描述

把元素分成两部分,对每一个部分采用递归的归并排序。
比较已经排好序的元素。
合并已经排好序的元素。
排序完毕。

平衡二叉树
平衡二叉树是自平衡的二叉树变种,可以保证快速的查找、插入和删除操作。

在这里插入图片描述
在这里插入图片描述

以图中的平衡二叉树为例:
左子节点比父节点小,而父节点比右子节点小。如果根节点左右子树的高度差超过 1,就变得不平衡。
想知道树中是否包含了元素 11?11 比 10 大,那么就查找 10 的右子节点 12。11 比 12 小,所以就查找 12 的左子节点,12 的左子节点刚好是要查找的 11。同样的,树中是否包含了元素 8?8 比 10 小,那么就查找 10 的左子节点 6。8 比 6 大,那么就查找 6 的右子节点。6 的右子节点不存在,说明树中不存在元素 8。
如何找到树中最小的元素?从根节点开始,一直顺着左子节点,找到最后一个叶子节点就是树中最小的元素。
如何找到 10 的下一个元素?如果根节点刚好是 10,那么就从 10 的右子树中找到最小的那个元素。如果根节点不是 10,那么先找到 10,如果 10 没有右子节点,那么就一直往父节点找,直到找到比 10 大的元素为止。
在树种加入 17 或删除 10,破坏了树的平衡,这个时候需要通过旋转恢复树的平衡。

图遍历
图遍历算法会遍历图中所有可达的顶点,可以通过辅助数据结构来实现各种遍历,比如使用无序集合实现随机遍历,使用堆栈实现深度优先遍历,使用队列实现广度优先遍历。

在这里插入图片描述

随机查找:选定一个顶点,把它放入一个无序集合中。从集合中取出一个顶点,访问该顶点,把该顶点的相邻顶点放入集合中,并把该顶点移出集合。重复这一过程,直到集合中的元素全部被遍历完毕。
深度优先遍历:选定一个顶点压入栈中,把该顶点其中的一个相邻顶点也压入栈中。访问栈顶的顶点,如果该顶点没有其他相邻的顶点,就出栈。如果有其他相邻顶点,就把其中的一个相邻顶点压入栈中。重复这一过程,直到栈中的元素全部被遍历完毕。
广度优先遍历:选定一个顶点,把该顶点的相邻顶点放进队列尾部。访问队列头部的顶点,把该顶点移出队列,如果该顶点有相邻顶点,就把相邻顶点放进队列尾部。重复这一过程,直到队列中的元素全部遍历完毕。

一笔画
一笔画是一种 Fleury 算法,旨在优雅地找出图中的欧拉(Eulerian)路径。欧拉路径是图中的一条路径,刚好经过每条边,并且每条边只被访问一次。

在这里插入图片描述

顶点度数表示该顶点有几条边。
如果图中有且仅有两个顶点的度数为奇数,其他为偶数,或者不存在奇数度数的顶点,则存在欧拉路径。
选定一个顶点开始画路径。
如果存在两个以上的桥,那么可以走桥。如果只剩下一个桥,就不能走桥,除非只剩下桥可以走。
如果还有没有走过的边,重复步骤 4。
成功画出欧拉路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值