关于复杂度:常见排序算法及复杂度
1. 常见算法复杂度大O加上()的模式,外面其实包裹的是一个函数f(),O(f()),指明某个算法的 “耗时/耗空间”与“数据增长量”之间的关系。其中的 n代表输出数据的量。 1.1. O(1)1. 解释最低复杂度,常量值。也就是 “耗时/耗空间” 与 “数据增长量” 无关,无论输出数据增大多少倍,“耗时/耗空间” 都不变。 2. 举例哈希算法就是典型的 O(1)工夫复杂度算法,例如 HashMap、布隆过滤器等哈希算法的利用,无论数据规模多大,在计算出 hash key 的值之后,都能够一次性找到指标(不思考哈希抵触的话)。 1.2. O(n)1. 解释数据量增大几倍,耗时也增大几倍。 2. 举例例如:最常见的遍历算法,遍历一次所有值,找出其中的最大值。 1.3. O(n^2)1. 解释对n个数排序,须要扫描 n^2次。 2. 举例例如:冒泡排序法、抉择排序法等。因为该算法都是2层循环,第一层循环遍历 n-1 趟,第二层循环遍历 n-i 趟(i递增)。 1.4. O(logn)1. 解释当数据增大n倍时,耗时增大logn倍。 这里 log 是以2为底。比方:log256=8 2. 举例二分查找法就是 O(logn) 的算法,每找一次就排除个别的可能性,256条数据中只需查找8次就能够。 1.5. O(nlogn)1. 解释当数据增大n倍时,耗时增大 n乘以logn 倍。例如当数据增大256倍,耗时增大 256*8 倍。 这个复杂度高于线性O(n),低于平方O(n^2)。 2. 举例归并排序法、疾速排序法的工夫复杂度就是 O(nlogn)。 2. 排序算法复杂度网上看到这张图: 2.1. 冒泡排序为啥 O(n^2)冒泡排序法遍历的次数: 总层数:n−1每层遍历次数:n−i(i在 1 ~ n 递增)可基于 ∑i 求和,计算出总次数:n(n−1)/2=n^2/2 - n/2既然是 n^2/2 - n/2,为什么说工夫复杂度是 O(n^2) 呢?因为咱们常说的复杂度不是精确的值,而是当数据量收缩时,随之工夫收缩的模型。当 n 趋向于无限大时,n^2/2 - n/2 也就趋向于 n^2。 ...