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

经典 O(n²)比较类排序算法

排序算法 时间复杂度 是否基于比较 冒泡、插入、选择 O(n²) 是 快排、归并 O(nlog~n~) 是 桶、计数、基数 O(n) 否 十种常见的的排序算法可以分两大类: 比较类排序:通过比较来决定元素的相对次序...比如我们一组数据 2,9,3,4,8,3,按照大小排序之后就是 2,3,3,4,8,9。 这组数据里两个 3。...但这种改进对于提升性能来说并没有什么太大作用。 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。.../** * 冒泡排序: 时间复杂度 O(n²),最坏时间复杂度 O(n²),最好时间复杂度 O(n),平均时间复杂度 O(n²) * 空间复杂度 O(1),稳定排序算法 */ public class...选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。

56420

O(N) 优化到 O(logN),你的第一想法是什么

你可以假设 nums[-1] = nums[n] = -∞。 示例 1: 输入: nums = [1,2,3,1] 输出: 2 解释: 3 是峰值元素,你的函数应该返回其索引 2。...说明: 你的解法应该是 O(logN) 时间复杂度的。 题目解析 目让你找出一个数组中的 peak element,数组中可能存在一个或者多个 peak element,但是你只需要找出一个就好。...这道题目最直接的办法就是直接遍历一遍数组,然后将每个元素与其左右相邻的元素进行比较,符合条件输出即可。 显而易见,这么做时间复杂度是 O(n),n 为数组中元素的个数。 有没有更快的方法呢?...比 O(n) 还要快的话,一般来说只会是 O(lgn) 和 O(1),O(1) 显然是不可能的,那么就只剩下 O(lgn)。 通过这个时间复杂度,我相信你应该知道用什么样的算法,没错就是二分查找。...题目描述中有一个细节是,我们可以认为 arr[-1] == arr[n] == -Inf,也就是两头的元素只需要和它相邻的一个元素比较即可。

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

Python-排序-哪些时间复杂度为O(n)的排序算法?

你可能会问为什么这些时间复杂度低至 O(n) 的排序算法会很少使用呢? 那就是因为这些排序算法对待排序的数据要求比较苛刻,这些算法理解其来比较简单,学习这类算法重要的是掌握它们的适用场景。...你可能会问了,假如桶的个数是 m,每个桶中的数据量平均 n/m, 这个时间复杂度明明是 m*(n/m)*(log(n/m)) = n log(n/m),怎么可能是 O(n) 呢 ?...这个问题非常好,原因是这样的,当桶的个数 m 接近与 n 时,log(n/m) 就是一个非常小的常数,在时间复杂度时常数是可以忽略的。...假设我们 10 万个手机号码,希望将这 10 万个手机号码从小到大排序,你什么比较快速的排序方法呢? 如果直接用快排,时间复杂度是O(nlogn),如果使用基数排序,时间复杂度为O(n)。...基数排序的适用场景 基数排序对要排序的数据是要求的,需要可以分割出独立的“位”来比较,而且位之间递进的关系,如果 a 数据的高位比 b 数据大,那剩下的低位就不用比较了。

1.4K20

漫画:Integer 竟然 4 种比较方法

return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } 从上述源码中可以看出这个方法中使用了...这一点其实在阿里巴巴的《Java开发手册》中也有相应的规定,规定的内容如下: 【强制】所有整型包装类对象之间值的比较,全部使用 equals 方法比较。...直接运算 compareTo 方法给我们了一个启发,我们可以直接将两个值进行相减,如果相减的值等于 0,则说明对比的两个值是相同的,示例代码如下: public class IntegerTest {...(-128~127),而后三种方式都可以正常用于 Integer 的比较,其中 equals 的比较方式是最简单也是最通用的。...互动话题 除了以上几种比较方式之外,你还知道其他的比较方式吗?欢迎讨论区补充留言。

21430

SQL优化之LIMIT语法, limit n,m 和 limit n什么区别?

在某些面试题中会遇到这样的问答或笔试题:“limit 0,1 和 limit 1什么区别?” 要准确回答这个问题就等深入明白limit一个参数和两个参数的本质区别。...limit n,m 中的第一次参数n表示的游标的偏移量,初始值为0,第二个参数m表示的是想要获取多少条数据。所以limit 0,1表示的是从第一条记录开始,只取一条即可。...我们首先来说一说 limit n,m是怎么回事,首先它要获取到第一个参数游标n的位置,那么它就必须得扫描到n的位置,接着从此位置起往后取m条数据,不足m条的返回实际的数量。...LIMIT n 又是什么? 上面已经说过limit0,1等价与limit 1,那他们到底啥区别呢?...但此方法索引的列无效,也就是说如果NAME这一列加了索引,执行以上两条sql语句效率是一样的。

11.6K30

​LeetCode短视频 | 真正O(log(m+n))的解法,那些说归并排序的别误导别人了

题被分类为困难题,但是看完题目之后是很多解法的,可以用归并排序,也可以用暴力解法。 但是难就难在时间复杂度,它要求是时间复杂度为O(log(m+n)),所以肯定会被用到二分查找。...如果使用归并排序的话时间复杂可能就在O(nlogn)上,远远就超过了二分查找的时间复杂度。 既然要求二分的方法,我们可以考虑这样的思路: 题目要求中位数,两个数组的长度之和除以2等于k。...因为两个数组,k还要再除以2, 得到的数值-1,分别置于两数组对应的下。 两数组都是升序排序,k的值我们要找第k大的数。 9大于3,说明第k大的数不在3的左部分,包括3。

90640

LeetCode 96,n个数构建BST的方法多少种?

通过率52.8%,从通过率上来看在Medium当中算是偏高的,实际上也的确如此,这道题没有什么诡计,也没有很刁钻的内容,考验的完全是我们对于数据结构最基本的理解。...在分治法当中我们把一个比较复杂的大问题转化成若干个相对容易解决的小问题,比如著名的归并排序就是利用的这个思路。而递归做的是什么事情呢,是函数自己调用自己,解决一个本质相同只是规模更小的问题。...针对这种情况我们需要对算法找一个开头,再构建出一种嵌套方法。...对于n个元素的BST来说,它的根节点的组成n种可能。假设根节点是i,那么我们可以得到它的左子树包含1-i-1这i-1个元素,右子树包含i+1到nn-i个元素。...return ret return dfs(n) 这种很简单的优化方法叫做记忆化搜索,说白了就是将可能会出现重复计算的中间值存储起来防止重复计算,从而优化运行速度

2K10

很少人真正了解 n 和 r 什么区别!

我们使用printf打印时基本都会用到 \n 和 \r 之类控制字符,比如: printf("hello world!\r\n"); 那你知道这些 \n 和 \r 的区别吗?...一、关于 \n 和 \r 在ASCII码中,我们会看到一类不可显示的字符,叫控制字符,其中就包含\r 和 \n 等控制字符。...回车和换行来源: 在计算机还没有出现之前,一种叫做电传打字机(Teletype Model 33)的玩意儿,每秒钟可以打10个字符。...'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。 有的编辑器只认\r\n,有的编辑器则两个都认。所以要想通用的话,最好用\r\n换行。...在微软的MS-DOS和Windows中,使用“回车CR('\r')”和“换行LF('\n')”两个字符作为换行符; Windows系统里面,每行结尾是 回车+换行(CR+LF),即“\r\n”; Unix

1.3K10

M方法与D方法什么区别

ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类。...使用M方法 如果是如下情况,请考虑使用 M方法: 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时 只有个别的表较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用...(create()方法中实现)、关联模型等 业务逻辑比较复杂,且涉及的表众多 将业务逻辑定义在了自定义的模型类里面(Lib/Model目录下),而想在操作中实现这些业务逻辑 另外 D方法 不支持跨项目调用...一个比较形象的比喻就是:M方法 就如一台刚装好操作系统的电脑,只能使用一些基本功能;而 D方法 就如在装好的系统上再安装了一些如 Office、QQ 等应用软件,功能更加强大,同时整个电脑运行速度也变慢了...以上是对 M方法和D方法区别的一些总结,M方法 和 D方法 要根据实际情况来具体选择。

60620

函数和方法什么区别

下面的实例,定义一个函数和方法,然后调用函数和方法。...1、调用函数时,直接使用函数名即可(如果调用者和被调用者都在同一个包名下);调用方法,需要实例化结构体,然后通过结构体的方式去调用方法(结构体实例化多种,示例代码使用的是字面量的方式)。...2、函数在定义时,直接使用 func + 函数名()即可;方法在定义时,需要使用 func (方法的接收者) + 函数名()才可以。 3、方法是通过"."的方式进行调用,而函数是直接使用函数名。...都能够修改原值,这一点不管是函数还是方法,都没是一样的。 是否同名 接下来,通过下面的实例代码,来演示函数和方法是否支持定义相同的名称。...⽅法接受者,⽽函数⽆接受者 1、Go语⾔的⽅法method是⼀种作⽤于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器); 2、接受者的概念类似于传统⾯向对象语⾔中的this

19020

dotnet 方法名 To 和 As 什么不同

在看到 dotnet 框架里面有很多方法里面用了 ToXx 和 AsXx 好像都是从某个类转换为另一个类,那么这两个方法命名什么不同 在约定的方法命名里面,用 To 的方法表示从类 A 转为类 B 同时这两个类将没有任何关联...,也就是对类 B 做的内容不会影响到原有的类 A 例如 ToString 方法 var str = new StringBuilder(); var foo...= str.ToString(); 上面代码的 str 在调用 ToString 方法之后,返回值将和原来的 StringBuilder 没有关系 而在用 As 的方法表示转换类之后,转换的类和原有的类有关联...,例如 List 的 AsReadOnly 方法 var foo = Enumerable.Range(0,100).ToList(); var readOnlyCollection...ReadOnlyCollection 类型,但是原有的 foo 和 readOnlyCollection 是有关联的,对 foo 的修改将会影响转换类的值如上面代码,将 foo 移除了第一个之后,相应的值也会修改 在方法命名里面用

1.3K40

【漫画】为什么O(n)复杂度的基数排序没有快速排序快?

是的,是可以以最高位来排序的,而且也像你说的,以最高位来排序的话,是可以减少数据之间比较的次数。但我们仍然不建议以最高位来排序,因为他个致命的缺点。 ? ?...这种方法确实可以减少比较的次数,不过请大家注意,在每个小部分的排序中,我们也是需要10个桶来将他们进行排序,最后导致的结果就是,每个不同值的元素都会占据一个“桶”,如果你1000个元素,并且1000个元素都是不同值的话...基数的时间复杂度为O(n),不过他是忽略了常数项,即实际排序时间为kn(其中k是常数项),然而在实际排序的过程中,这个常数项k其实是很大的,这会很大程度影响实际的排序时间,而像快速排序虽然是nlogn,...但它前面的常数项是相对比较小的,影响也相对比较小。...文章讲这里,也结束了,如果你什么其它想法,欢迎后台来骚扰。 收获?不妨点个赞,让更多的人看到这篇文章!

71410
领券