![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
玩转算法
文章平均质量分 63
归纳总结常见算法,并给出C++、Python实现程序
洌泉_就这样吧
Less is more.
展开
-
排序算法总结
排序算法是《数据结构与算法》中最基本的算法之一。排序算法的常见概念有:稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数排序算法平均时间复杂度最好情况最坏情况空间复杂度稳定性冒泡排序O(n2)O(n^2)O(n2)$O(n)原创 2021-05-20 14:22:37 · 62 阅读 · 0 评论 -
数据结构(一):栈、队列、链表、有根树
《算法导论》笔记1 栈(stack)概念栈和队列都是动态集合,栈实现的是后进先出(last-in,first-out,LIFO),删除操作作用于最近插入的元素操作栈上的INSERT操作称为压入(PUSH),DELETE操作称为弹出(POP)当栈中不包含任何元素,则栈是空的(empty),对空栈执行弹出操作,称为栈下溢(underflow),如果栈内元素超过所分配内存上限,则会出现栈上溢(overflow)三种栈操作的时间复杂度都为O(1)// 用数组实现栈#include<i.原创 2021-07-21 17:25:05 · 130 阅读 · 0 评论 -
数据结构(二):散列表、二叉搜索树
《算法导论》笔记1 散列表(hash table)散列表是实现字典操作的一种有效数据结构,查找一个元素的时间最坏情况是O(n),而在合理假设下,查找性能都是极好的,平均时间可达O(1)散列表是普通数组的推广,寻址可以类比数组的O(1)时间内访问任意位置散列表是根据关键字计算相应下标,通过链接(chaining)方法解决冲突(collision),冲突就是多个关键字映射到数组的同一个下标直接寻址表:使用数组表示动态集合,数组每个位置称为槽(slot),把对象存放在槽中使用散列函数根据关键字k计.原创 2021-07-23 11:01:40 · 163 阅读 · 0 评论 -
《算法图解》知识点纪要
读后感《算法图解》是经典的算法书,受到很多人推崇为入门书籍,第一次阅读此书是20年上半年,觉得内容比较浅显,粗略看过,第二次是21年上半年,对于例子部分跳过较多,原理部分详细阅读,并仔细做了纪要此书作为算法入门书籍的优势在于讲解生动,但是由于算法这个话题太过于广泛,所以阅读起来会觉得书本逻辑跳跃较大,前后章节的关联性时有时无,下面尝试理一理书本的内容逻辑数据结构:数组、链表、散列表、队列、调用栈、二叉查找树算法思想:二分查找、递归算法、分治算法、动态规划、贪婪算法、广度优先算法排序算法:选择排序原创 2021-07-20 15:39:23 · 119 阅读 · 0 评论 -
二叉搜索树三种遍历方法
二叉搜索树定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。 (来源:百度原创 2021-07-16 10:15:20 · 1450 阅读 · 4 评论 -
KMP算法
KMP简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)(来源:百度百科)简而言之,KMP名称取自于Knuth-Morris-Pratt,这是实现模式串和主串快速匹配算法,复杂度可以原创 2021-07-15 17:16:19 · 95 阅读 · 0 评论 -
漫谈二分法边界问题
二分法二分法是一种快速搜索算法,搜索对象是已排好顺序的序列,时间复杂度为O(logn)O(\log n)O(logn),即对数时间二分法的基本操作步骤包括:(1)初始化双指针lhs和rhs分别指向起始和终点,设置循环终止条件;(2)计算指针中间值mid,然后判别mid位置的对应值是否满足要求;(3)根据判别结果更新lhs和rhs计算指针中间值mid,常用mid=lhs + (rhs - lhs)/2,目的是为了防止数据范围溢出二分法使用场景是:有序&判别问题,使用要点是:边界问题边界原创 2021-07-12 11:13:04 · 389 阅读 · 0 评论 -
插入排序(Insertion-Sort)
1 概述插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。通俗讲就是,好比打斗地主时抓扑克牌一样,每次抓起一张牌就找到其合适的位置放进去。2 算法流程每次循环需要加入一个未排序的元素key,从后往前扫描,如果比key大的数就将其后移位置,给key腾位置,扫描到初始位置或找到不大于key的元素,实际上就是给key找合适的位置放进去第1个元素不用找位置,从第2个元素开始按照步骤1找原创 2021-05-24 10:35:18 · 523 阅读 · 0 评论 -
基数排序(Radix Sort)
1 概述基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。2 算法流程取得数组中的最大数,并取得位数;arr为原始数组,从最低位开始取每个位组成radix数组;对radix进行计数排序(利用计数排序适用于小范围数的特点);3 代码/Pythonimport random def radix_sort(arr):原创 2021-05-21 16:49:04 · 146 阅读 · 0 评论 -
桶排序(Bucket Sort)
1 概述桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。2 算法流程设置一个定量的数组当作空桶;遍历输入数据,并且把数据一个一个放到对应的桶里去;对每个不是空的桶进行排序;从不是空的桶里把排好序的数据拼接起来。3 代码/Pythonimport random原创 2021-05-21 16:35:57 · 429 阅读 · 0 评论 -
计数排序(Counting Sort)
1 概述计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。2 算法流程找出待排序的数组中最大和最小的元素统计数组中每个值为i的元素出现的次数,存入数组C(即容器)的第i项根据容器计数结果重新填充目标数组,从小到大或从大到小,例如,计数了m个50就填充m个3 代码/Pythondef countingSort(arr, maxValue): # 根据最大值来构建容器原创 2021-05-21 16:02:06 · 184 阅读 · 0 评论 -
堆排序(Heap Sort)
1 概述堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。2 算法流程首先构建最大堆,要求是每个非叶节点的值大于其左右子节点的值,构建过程从非叶节点最大序号开始,根据【父节点是i,则其左子节点是2*i+1,其右子节点是2*i+2】的规律,进行检查,如果不满足则需要做交换根据最大堆,将根节点的最大值与末尾叶节点交换,将最大值取出,实质上是选择过程,然后重新检查堆,调整为最大堆原创 2021-05-21 15:43:05 · 127 阅读 · 0 评论 -
归并排序(Merge Sort)
1 概述归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列间有序。若将两个有序表合并成一个有序表,称为2路归并。2 算法流程拆分:将序列进行拆分,一半操作是分成长度相等(或接近)的两个子序列合并:将两个子序列进行合并,同时遍历两个子序列,依次取出较大/较小数递归调用,拆分终止条件是序列长度小于等于1,合并是从小序列开始逐步合并3 代码/Pyt原创 2021-05-21 10:26:47 · 119 阅读 · 0 评论 -
希尔排序(Shell Sort)
1 概述希尔排序(Shell Sort)是1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。2 算法流程每次循环需要加入一个未排序的元素key,从后往前扫描,如果比key大的数就将其后移位置,给key腾位置,扫描到初始位置或找到不大于key的元素,实际上就是给key找合适的位置放进去第1个元素不用找位置,从第2个元素开始按照步骤1找位置,依次进行,直至完成最后1个位置的找位置操作3原创 2021-05-20 16:37:25 · 145 阅读 · 0 评论 -
冒泡排序(Bubble Sort)
1 概述冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小或越大的元素会经由交换慢慢“浮”出2 算法流程相邻元素比较,升序排列则较大的数放后面,降序排列则较小的数放后面完成一次遍历就能确定出所有未排序元素的最大值或最小值,放在最后,是为冒泡算法通过嵌套的两层循环完成所有元素的冒泡3 代码/Pythondef BubbleSort原创 2021-05-20 14:41:56 · 135 阅读 · 0 评论 -
选择排序(Selection Sort)
1 概述选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的起始位置。以此类推,直到所有元素均排序完毕。2 算法流程假设完成升序排列,初始选择所有未排列的数列起始位置的元素为最小值,然后遍历之后的所有未排列的数列,如果存在比设定最小值更小的数,则替换设定的最小值每次循环按照步骤1进行,第1次确定出最小值,放在第1位,第2次确定出第2小值,原创 2021-05-20 15:13:43 · 496 阅读 · 0 评论