首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【初阶数据结构与算法】排序算法总结篇(每个小节后面有源码)(直接插入、希尔、选择、堆、冒泡、快速、归并、计数以及非递归快速、归并排序)

) 特点 (1) 非递归快速排序是一种基于分治思想的排序算法,但与递归快速排序不同的是,它使用显式的栈或队列等数据结构来保存待排序的子数组范围,从而避免了递归调用带来的栈溢出风险 (2)在每次迭代中...在最优情况下,每次合并操作都能将两个长度相等的子数组合并成一个有序数组,迭代次数为log n(以2为底),每层迭代处理n个元素,因此时间复杂度为O(n log n) 最劣情况:O(n log n)    ...无论输入数组的顺序如何,非递归归并排序的迭代次数都保持在log n,每层迭代仍然需要处理n个元素,因此时间复杂度始终为O(n log n),具有较好的稳定性 平均情况:O(n log n)    非递归归并排序的平均时间复杂度也保持在...在合并两个有序子数组时,需要额外的存储空间来存放合并后的数组 (2)虽然非递归实现避免了递归调用栈的开销,但仍然需要额外的空间来保存合并过程中的中间结果。...在每次迭代中,非递归归并排序选择相邻的两个子数组进行合并,直到整个数组有序 优点 (1)稳定性保证了相等元素的相对位置不变 (2)时间复杂度为O(n log n),具有较好的性能 (3)避免了递归调用带来的栈溢出风险

7310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PHP常见排序算法整理学习

    思路分析 计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。...它只能对整数进行排序 算法描述: 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);...{ $resArr[] = $k; } } return $resArr; } 小结: 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中...由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。...bubbleSort 用时:162055.89604378 ms insertSort 用时:12029.093980789 ms 内置sort 用时:3.0169486999512 ms 所以,简单需求的数组排序处理还是建议使用内置的

    94630

    二叉搜索树中的众数是多少?

    在求众数集合的时候有一个技巧,因为题目中众数是可以有多个的,所以一般的方法需要遍历两遍才能求出众数的集合。 但可以遍历一遍就可以求众数集合,使用了适时清空结果集的方法,这个方法还是很巧妙的。...关键是在有序数组上的话,好搞,在树上怎么搞呢? 这就考察对树的操作了。 在二叉树:搜索树的最小绝对差中我们就使用了pre指针和cur指针的技巧,这次又用上了。...弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。 而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。...所以下面要做如下操作: 频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。...二叉树前中后序转迭代,传送门: 二叉树:前中后序迭代法 二叉树:前中后序统一风格的迭代方式 下面我给出其中的一种中序遍历的迭代法,其中间处理逻辑一点都没有变(我从递归法直接粘过来的代码,连注释都没改,哈哈

    63760

    redis命令keys和scan的区别

    这意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程; 当SCAN命令的游标参数(即cursor)被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为...注意:返回的游标不一定是递增的,可能后一次返回的游标比前一次的小。 在第二次调用 SCAN 命令时, 命令返回了游标 0 , 这表示迭代已经结束, 整个数据集已经被完整遍历过了。...COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。使用COUNT 选项对于对增量式迭代命令相当于一种提示, 大多数情况下这种提示都比较有效的控制了返回值的数量。...并非每次迭代都要使用相同的 COUNT 值,用户可以在每次迭代中按自己的需要随意改变 COUNT 值, 只要记得将上次迭代返回的游标用到下次迭代里面就可以了。...MATCH 选项对元素的模式匹配工作是在命令从数据集中取出元素后和向客户端返回元素前的这段时间内进行的, 所以如果被迭代的数据集中只有少量元素和模式相匹配, 那么迭代命令或许会在多次执行中都不返回任何元素

    3.4K42

    php7数组的实现及部分源码分析

    当bucket元素被更新或者被删除时,会对bucket的value调用该函数,如果value是引用计数的类型,那么会对value引用计数减1,进而引发可能的gc。...为了解决循环引用导致的死循环问题,当对某数组进行某种递归操作时(比如递归count),在递归调用入栈之前将nApplyCount加1,递归调用出栈之后将nApplyCount减1。...u.v.nIteratorsCount:迭代器计数。PHP中每一个foreach语句都会在全局变量EG中创建一个迭代器,迭代器包含正在遍历的HashTable和游标信息。...该字段记录了当前runtime正在迭代当前HashTable的迭代器的数量。 u.v.consistency:成员用于调试目的,只在PHP编译成调试版本时有效。...每一个key-value对的存储位置都是确定的,都存储在bucket数组的第key个元素上。 packed array不需要索引数组。

    1.4K30

    Redis Hash(Hash) 复习

    介绍 哈希相当于一个二维数组,内部是无序字典。 哈希也是是一个 string 类型的 field(字段) 和 value(值) 的映射表,所以哈希特别适合用于存储对象。...同样还可以用于购物车数据的存储,比如key为用户id,field为商品id,value为购买数量等等。 数据结构 哈希是数组 + 链表二维结构。...count] MATCH 正则匹配模式 COUNT limit 遍历的条数 ---- 重点注意:HSCAN 命令是一个迭代器,是一个迭代器,是一个迭代器!...因为是迭代器,所以每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程, 当SCAN命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为...Redis 6.0 以上版本中 SCAN COUNT参数需要多次迭代遍历,而HSCAN COUNT 不需要多次迭代遍历,只需要设置迭代次数则可以全部迭代 SCAN COUNT 需要如下遍历 遍历结果如

    1.7K30

    php底层原理之垃圾回收机制

    php变量的内部存储结构 首先还是需要了解下基础知识,便于垃圾回收原理内容的理解。...大家都知道php是由C编写而成的,所以php变量的内部存储结构也会和C语言相关,即zval的结构体: struct _zval_struct { union { long lval..._gc ;而php7版本之后由于性能问题所以改写了zval结构,这里不再表述 引用计数原理 了解了php变量的内部存储结构之后,我们再了解下php变量赋值相关的原理和早期垃圾回收机制 变量容器 非array...0 当变量容器的ref_count计数清0时,表示该变量容器就会被销毁,实现了内存回收,这也是 php5.3版本之前的垃圾回收机制 举例: $a = "许铮的技术成长之路"; $b = $a; xdebug_debug_zval...其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。

    80340

    PHP数据结构(二十一) ——希尔排序

    二、算法 希尔排序实质上就是跳跃版的直接插入排序,其每次都设定一个不同的增量,如第一次增量是5、第二次增量是3,进行两轮插入排序后,最后再从头进行一次直接插入排序。...1)把数组进行分组,因为增量是5,因此把下标048、159、26、37分别划分到各组,对每组依次进行直接插入排序,排序后每一组包含的数组下标还是原先的那几个数字(如048组进行插入排序,假设0对应的值大于...3)将前两轮排序后的数组,从头开始进行插入排序。 4)以此为拓展,可以输入一组增量数组,按照增量的值,依次进行分组的插入排序,最后再进行一次增量为1的插入排序。..., array $arr = array()){ //如果增量数组长度小于1,直接调用直接插入排序即可 if(1> count...PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论) PHP数据结构(七) ——串与实现KMP算法 PHP数据结构(六) ——树与二叉树之概念及存储结构 PHP数据结构(六) ——数组的相乘、广义表

    88870

    【初阶数据结构】——写了将近 5 万字,终于把 二叉树 初阶的内容讲清楚了

    二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。 2.5.2 链式存储 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。...那在每次插入新数据之后,我们就要对堆进行检查和调整,确保在加入新的数据之后,它还是一个堆。 那如何调整,这就是我们接下来要学习的: 3.3.1 堆的向上调整算法 1....好像不难,我们还是去遍历一遍二叉树(当然这里选择哪种遍历方式都可以),搞一个计数器,遍历到不是空的结点计数器++就行了嘛。...我们这里还是用了递归的方法,而size是我们定义在函数内部的一个局部变量,每次递归,都会建立新的函数栈帧,那size自然也会随着每次递归在新的函数栈帧中重新创建。...,而是会存储在静态区,静态局部变量的初值是在编译期间就指定的,所以运行期间每次递归都不会在重新创建变量size了,这样我们每次++的就是同一个size了。

    35010

    PHP底层的运行机制与原理

    Zval主要由三部分组成: type:指定了变量所述的类型(整数、字符串、数组等) refcount&is_ref:用来实现引用计数(后面具体介绍) value:核心部分,存储了变量的实际数据 Zvalue...PHP中的变量就是引用计数的典型应用。Zval的引用计数通过成员变量is_ref和ref_count实现,通过引用计数,多个变量可以共享同一份数据。避免频繁拷贝带来的大量消耗。...在进行赋值操作时,zend将变量指向相同的zval同时ref_count++,在unset操作时,对应的ref_count-1。只有ref_count减为0时才会真正执行销毁操作。...对于索引数组,通过foreach遍历效率比for高很多,省去了key->value的查找。count操作直接调用HashTable->NumOfElements,O(1)操作。...获取变量值:PHP的符号表是通过hash_table实现的,对于每个变量都分配唯一标识,获取的时候根据标识从表中找到相应zval返回。

    3.9K60

    JavaScript迭代器 | 8月更文挑战

    ,每次迭代执行什么操作,及多会儿停止迭代 ES5新增了Array.prototype.forEach()方法,可以进行单独记录索引及通过数组对象取得值(不够理想)因为这个方法只适用于数组,且回调比较笨拙...字符串、数组、映射、集合、arguments对象、NodeList等DOM集合类型都实现了iterable接口 let str = 'abc'; let arr = ['a', 'b', 'c']; let...迭代器 API 使用 next()方法 在可迭代对象中遍历数据。...每次成功调用 next(),都会返回一个 IteratorResult 对象,其中包含迭代器返回的下一个值。若不调用 next(),则无法知道迭代器的当前位置。...为了让一个可迭代对象能够创建多个迭代器,必须每创建一个迭代器就对于一个新计数器,为此我们可以把计数器变量放到闭包里,然后通过闭包返回迭代器 class Counter {

    22820

    PHP底层运行机制与原理剖析

    Zval主要由三部分组成: type:指定了变量所述的类型(整数、字符串、数组等) refcount&is_ref:用来实现引用计数(后面具体介绍) value:核心部分,存储了变量的实际数据 Zvalue...因为要存储多种类型,所以zvalue是一个union,也由此实现了弱类型。 php变量类型和其实际存储对应关系如下: ? 引用计数在内存回收、字符串操作等地方使用非常广泛。...PHP中的变量就是引用计数的典型应用。 Zval 的引用计数通过成员变量 is_ref 和 ref_count 实现,通过引用计数,多个变量可以共享同一份数据。避免频繁拷贝带来的大量消耗。...在进行赋值操作时, zend 将变量指向相同的 Zval 同时 ref_count++ ,在 unset 操作时, ref_count-1。只有当 ref_count 减为0时,才会真正执行销毁操作。...整数、浮点数是PHP中基础类型之一,也是一个简单型变量。对于整数和浮点数,在Zvalue中是直接存储对应的值。

    3.4K10

    2021年最新大厂php+go面试题集(二)

    关键字 defer 用于注册延迟调用。 2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。 3....goroutinue会在一个队列里面,每次执行就会pop一个出来,当阻塞时, 会调用其他的协程来做切换。...例如Add(2)或者两次调用Add(1)都会设置等待计数器的值为2,表示要等待2个goroutine 完成 Done():每次需要等待的goroutine在真正完成之前,应该调用该方法来人为...表示goroutine完成了,该方法会对等待计数器减1 Wait():在等待计数器减为0之前,Wait()会一直阻塞当前的goroutine 3.mysql的事务如何优化提升速度...1)数组存储每个节点,key=>节点查询的时候先判断key在不在数组 2)注意数组要定义长度的,超过长度则删除尾部值 3)put的时候,注意数组满没满,没满就生成新节点, 然后插入到链表头部

    61120

    php的垃圾回收机制

    xdebug扩展 引用计数特殊情况 当变量值为整型,浮点型时,在赋值变量时,php7底层将会直接把值存储(php7的结构体将会直接存储简单数据类型),refcount将为0 $a = 1111; $...而$c并非是引用变量,所以将值复制给了$c,$c引用还是为1 详细引用计数知识,底层原理可查看:https://www.cnblogs.com/sohuhome/p/9800977.html php生命周期...php将每个运行域作为一次生命周期,每次执行完一个域,将回收域内所有相关变量: <?...$i);     $i++;     echo "数组大小:". count($arr).'...的符号表,遍历所有变量,去实现引用计数的计算并清理内存,将消耗大量的cpu资源,不建议频繁使用 另外,除去这些方法,php内存到达一定临界值时,会自动调用内存清理(我猜的),每次调用都会消耗大量的资源

    1.2K10

    PHP 底层的运行机制与原理

    Zval主要由三部分组成: type:指定了变量所述的类型(整数、字符串、数组等) refcount&is_ref:用来实现引用计数(后面具体介绍) value:核心部分,存储了变量的实际数据 Zvalue...PHP中的变量就是引用计数的典型应用。Zval的引用计数通过成员变量is_ref和ref_count实现,通过引用计数,多个变量可以共享同一份数据。避免频繁拷贝带来的大量消耗。...在进行赋值操作时,zend将变量指向相同的zval同时ref_count++,在unset操作时,对应的ref_count-1。只有ref_count减为0时才会真正执行销毁操作。...整数、浮点数是PHP中的基础类型之一,也是一个简单型变量。对于整数和浮点数,在zvalue中直接存储对应的值。其类型分别是long和double。...对于索引数组,通过foreach遍历 效率比for高很多,省去了key->value的查找。count操作直接调用 HashTable->NumOfElements,O(1)操作。

    1.5K70

    php的垃圾回收机制

    xdebug扩展 引用计数特殊情况 当变量值为整型,浮点型时,在赋值变量时,php7底层将会直接把值存储(php7的结构体将会直接存储简单数据类型),refcount将为0 $a = 1111; $...而$c并非是引用变量,所以将值复制给了$c,$c引用还是为1 详细引用计数知识,底层原理可查看:https://www.cnblogs.com/sohuhome/p/9800977.html php生命周期...php将每个运行域作为一次生命周期,每次执行完一个域,将回收域内所有相关变量: <?...$i); $i++; echo "数组大小:". count($arr).'...的符号表,遍历所有变量,去实现引用计数的计算并清理内存,将消耗大量的cpu资源,不建议频繁使用 另外,除去这些方法,php内存到达一定临界值时,会自动调用内存清理(我猜的),每次调用都会消耗大量的资源

    96230
    领券