过往年少|初学者友好!最全算法学习资源汇总(附链接)( 二 )


用python代码实现:
归并排序
归并排序(英语:Merge sort , 或mergesort) , 是创建在归并操作上的一种有效的排序算法 ,。 1945年由约翰·冯·诺伊曼首次提出 。 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 , 且各层分治递归可以同时进行 。
用python代码实现:
选择排序
选择排序(Selection sort)是一种简单直观的排序算法 。 它的工作原理如下 。 首先在未排序序列中找到最小(大)元素 , 存放到排序序列的起始位置 , 然后 , 再从剩余未排序元素中继续寻找最小(大)元素 , 然后放到已排序序列的末尾 。 以此类推 , 直到所有元素均排序完毕 。
用python代码实现:
希尔排序
希尔排序 , 也称递减增量排序算法 , 是插入排序的一种更高效的改进版本 。 希尔排序是非稳定排序算法 。 希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时 , 效率高 , 即可以达到线性排序的效率;但插入排序一般来说是低效的 , 因为插入排序每次只能将数据移动一位 。
用python代码实现:
2、搜索算法
二分查找算法
过往年少|初学者友好!最全算法学习资源汇总(附链接)二分查找算法是一种在有序数组中查找某一特定元素的搜索算法 。 搜素过程从数组的中间元素开始 , 如果中间元素正好是要查找的元素 , 则搜素过程结束;如果某一特定元素大于或者小于中间元素 , 则在数组大于或小于中间元素的那一半中查找 , 而且跟开始一样从中间元素开始比较 。 如果在某一步骤数组为空 , 则代表找不到 。 这种搜索算法每一次比较都使搜索范围缩小一半 。 折半搜索每次把搜索区域减少一半 , 时间复杂度为Ο(logn)。
BFPRT(线性查找算法)
BFPRT算法解决的问题十分经典 , 即从某n个元素的序列中选出第k大(第k小)的元素 , 通过巧妙的分析 , BFPRT可以保证在最坏情况下仍为线性时间复杂度 。
算法步骤:
1.将n个元素每5个一组 , 分成n/5(上界)组 。
2.取出每一组的中位数 , 任意排序方法 , 比如插入排序 。
3.递归的调用selection算法查找上一步中所有中位数的中位数 , 设为x , 偶数个中位数的情况下设定为选取中间小的一个 。
4.用x来分割数组 , 设小于等于x的个数为k , 大于x的个数即为n-k 。
5.若i==k , 返回x;若ik , 在大于x的元素中递归查找第i-k小的元素 。
终止条件:n=1时 , 返回的即是i小元素 。
DFS(深度优先搜索)
深度优先搜索算法(Depth-First-Search) , 是搜索算法的一种 。 它沿着树的深度遍历树的节点 , 尽可能深的搜索树的分支 。 当节点v的所有边都己被探寻过 , 搜索将回溯到发现节点v的那条边的起始节点 。 这一过程一直进行到已发现从源节点可达的所有节点为止 。 如果还存在未被发现的节点 , 则选择其中一个作为源节点并重复以上过程 , 整个进程反复进行直到所有节点都被访问为止 。 DFS属于盲目搜索 。
深度优先搜索是图论中的经典算法 , 利用深度优先搜索算法可以产生目标图的相应拓扑排序表 , 利用拓扑排序表可以方便的解决很多相关的图论问题 , 如最大路径问题等等 。 一般用堆数据结构来辅助实现DFS算法 。
深度优先遍历图算法步骤:
1.访问顶点v;
2.依次从v的未被访问的邻接点出发 , 对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
3.若此时图中尚有顶点未被访问 , 则从一个未被访问的顶点出发 , 重新进行深度优先遍历 , 直到图中所有顶点均被访问过为止 。