笔试面试——算法篇

排序算法

选择原则:数据量小考虑编程量;数据量大考虑执行时间和存储空间。
按数据量:
大列表:快排,归并,桶排序,基数排序
小列表:冒泡,选择,插入,Shell
O(1)< O(log2n)< O(n) < O(nlog2n) < O(n^2)
平均时间复杂度排序:基数< 堆、归并、快排 < shell < 插入、冒泡、选择
这里写图片描述

冒泡排序

每次比较交换相邻的两个元素,从第一对到最后一对,此时最后的元素是最大的,循环这个过程直到没有元素要交换。
时间复杂度 O(n^2)
稳定,效率低,适用于小列表

选择排序

首先在未排序序列中找到最小元素,并于该序列的首元素做交换,再从剩余的未排序序列中继续寻找最小元素重复以上过程,直到未排序序列中仅剩一个元素为止。
时间复杂度 O(n^2)
稳定,适用于小列表

插入排序

从第一个元素开始,该元素可以认为已经有序;取出下一个元素,在已经排序的元素序列中从后向前扫描;若该元素大于新元素,则将该元素移到下一个位置;若该元素小于或等于新元素,则将新元素插入到该元素之后;循环这个过程,直至处理完所有的元素。
时间复杂度 O(n^2)
稳定,没有交换仅移动,适用于小列表。若列表基本有序,则插入排序比冒泡、选择更有效率。

壳(Shell)排序

缩小增量排序,选定一个增量,分组子列表,分别插入排序,缩小增量,直到1,完成整个列表的排序。
效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。
改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。适用于排序小列表。

归并排序

合并排序是一种分治算法。这个算法不断地将一个数组分为两部分,分别对左子数组和右子数组排序,然后将两个数组合并为新的有序数组。
时间复杂度 最优:O(nlog(n)) 最差:O(nlog(n)) 平均:O(nlog(n))
稳定,对数据有序性不敏感,非就地排序,适用于排序大列表。

快速排序

每次从序列中找出一个元素作为基准;从新组织序列,所有小于基准的放左侧,大于基准的放右侧;以递归的方式分别对左右两个分组进行排序。
时间复杂度 最优:O(nlog(n)) 最差:O(n^2) 平均:O(nlog(n))
不稳定。效率高,适用于大列表,均匀分组速度会更快。

桶排序

桶排序是一种将元素分到一定数量的桶中的排序算法。每个桶内部采用其他算法排序,或递归调用桶排序。
时间复杂度 最优:Ω(n + k) 最差: O(n^2) 平均:Θ(n + k)

基数排序

基数排序类似于桶排序,将元素分发到一定数目的桶中。不同的是,基数排序在分割元素之后没有让每个桶单独进行排序,而是直接做了合并操作。
时间复杂度 最优:Ω(nk) 最差: O(nk) 平均:Θ(nk)

堆排序

给定一个待排序序列,首先经过一次调整,将序列构建成一个大顶堆,此时第一个元素是最大的元素,将其和序列的最后一个元素交换,然后对前n-1个元素调整为大顶堆,再将其第一个元素和末尾元素交换,这样最后即可得到有序序列。
时间复杂度

拓扑排序

拓扑排序是有向图节点的线性排序。对于任何一条节点 u 到节点 v 的边,u 的下标先于 v。
时间复杂度:O(|V| + |E|)

ref:
https://blog.csdn.net/yushiyi6453/article/details/76407640

搜索算法

线性查找

按顺序逐一比较。
O(n)
效率低,不适合搜索大列表,对有序性没有要求

二分查找

假设数据按升序排列,取中间位置值,如果目标等于中值,则查找成功;如果目标小于中值,则在中值左侧继续查找;如果目标大于中值,则在中值右侧继续查找;直到找到或者找不到为止。
O(logN)
前提是有序的,适用搜索大列表

散列搜索

优:速度快
缺:两个键产生相同的散列值,冲突;不能顺序访问散列表中的项。
最佳效率O(1),散列的效率取决于散列函数的质量。

猜你喜欢

转载自blog.csdn.net/crayon_chen/article/details/80151340