作为一名刚上大三的学生,还是希望能目光长远一点,将目标定于明年的春招,所谓,宝剑锋从磨砺出,梅花香自苦寒来,相信很多同学跟我一样,都已经开始准备明年的春招了,所以,博主希望跟大家一起努力,收获成功!
文章目录
冒泡排序
- 在乱序的条件下的时间复杂度是O(n^2),有序情况下的时间复杂度是O(n)
- 稳定排序
- 空间复杂度:O(1)
选择排序
算法思路:
首先找到数组中的最小元素,然后将这个最小元素和数组的第一个元素交换位置,如果第一个元素就是最小元素,就和自己交换位置;再次,在剩下的元素中找到最小元素和数组中的第二个元素交换位置,如此往复,直到将整个数组排序,一句话总结就是,不断在剩余元素中找最小元素
- 不稳定排序
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
- 选择排序是数据移动最少的,每次交换两会改变两个数组元素的值,因此选择排序用了N次交换,交换次数和数组大小是线性关系
快速排序
算法思路
快速排序是将一个数组分成两个子数组,将两个子数组分别独立排序,当两个子数组有序时数组就有序,需要找到一个基准值来划分数组成两个子数组,分别是比基准值大和比基准值小,递归的进行排序
python实现
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
- 不稳定排序
- 算法思想:分治
快速排序优化:
- 对于小数组,快速排序比插入排序要慢,所以当对小数组进行排序时,可以切换到插入排序
归并排序
算法思路:
归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序
- 算法思想:分治
- 时间复杂度:O(nlogn)
- 空间复杂度:O(n)
- 稳定排序
堆排序
堆排序是基于二叉堆(优先队列)实现的,通过建立最大堆或者最小堆,删除堆顶的最值元素后将堆顶元素放入指定集合,重新建堆,最后集合便是有序序列
- 不稳定排序
- 时间复杂度:O(nlogn)
插入排序
算法思路:
与选择排序一样,当前索引左边的所有元素都是有序的,但是他们的最终位置还不确定,为了给更小的元素腾出空间,他们可能会被移动,但是当索引到达数组的末端,数组排序就完成了
- 稳定排序
- 时间复杂度分析:O(N^2),如果序列在排序前已经是有序序列,则为O(N)
- 空间复杂度分析:O(1)
- 数据量较少时效率高。插入排序适合数据量少的情况
- 算法的实际运行效率优于选择排序和冒泡排序。
- 插入排序对于部分有序的数组很有效,部分有序的数组类如数组中每个元素距离他的最终位置不远,一个有序的大数组接一个小数组,数组中只有几个元素的位置不正确
希尔排序
算法思想:
希尔排序是一种基于插入排序的快速排序算法,对于大规模的数据,插入排序很慢,因为随着数据规模的增大,移动规模也可能随着增大,因为插入排序只会交换相邻的元素,元素只能一点点的从数组一端移动到指定位置,但是希尔排序是使用一种步长的思想,根据指定步长分为h个子数组,每个子数组进行插入排序,形成了h个有序子数组
- 不稳定排序
- 希尔排序的时间复杂度较直接插入排序低,它的时间是所取“增量”(步长gap)序列的函数。
最好时间复杂度: O(n) – 有序情况下
平均时间复杂度: O(1.2^n ~ 1.5^n) – Hibbard
最坏时间复杂度: O(n^2) — 希尔增量 - 空间复杂度:O(1)
桶排序
将序列中的元素分配到各自的桶。
对每个桶内的元素进行排序。可以选择任意一种排序算法。
将各个桶中的元素合并成一个大的有序序列。
- 桶排序时间复杂度可以认为接近O(n)
- 空间复杂度取决于桶的数量
- 桶排序是稳定排序,但是当桶内的排序是其他不稳定的排序,例如快速排序时就不再稳定了
计数排序
- 稳定排序
- 其空间复杂度和时间复杂度均为O(n+k)线性时间复杂度,其中k是整数的范围(取决于辅助数组大小)
- 非比较排序
- 计数排序其实是桶数取 max - min + 1最大时的桶排序
基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。他是根据键值的每位数字来分配桶;然后每一位每一位的比较
- 最低位优先法,简称LSD法:先从最低位开始排序,再对次低位排序,直到对最高位排序后得到一个有序序列;
- 最高位优先法,简称MSD法:先从最高位开始排序,再逐个对各分组按次高位进行子排序,循环直到最低位。
- 基数排序是稳定排序,在某些时候,基数排序法的效率高于其它的稳定性排序法。
- 时间复杂度:O(N)
- 空间复杂度:O(N)
基数排序,计数排序其实是桶排序的特殊情况:
- 基数排序:根据键值的每位数字来分配桶;
- 计数排序:每个桶只存储单一键值;
- 桶排序:每个桶存储一定范围的数值;
整理
排序算法 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 内部or外部排序 |
冒泡排序 | O(n) | O(n^2) | O(1) | 内部排序 |
选择排序 | O(n^2) | O(n^2) | O(1) | 内部排序 |
插入排序 | O(n) | O(n^2) | O(1) | 内部排序 |
计数排序 | O(n+k) | O(n+k) | O(k) | 外部排序 |
基数排序 | O(nk) | O(nk) | O(n+k) | 外部排序 |
桶排序 | O(n+k) | O(n^2) | O(k) | 外部排序 |
希尔排序 | O(nlogn) | O(1) | 内部排序 | |
归并排序 | O(nlogn) | O(nlogn) | O(1) | 内部排序 |
快速排序 | O(nlogn) | O(n^2) | O(1) | 内部排序 |
堆排序 | O(nlogn) | O(nlogn) | O(1) | 内部排序 |