算法稳定性,时间复杂度,空间复杂度等算法基础知识: 经典算法----基础知识
冒泡排序: 基础算法----冒泡排序
选择排序: 基础算法----选择排序
插入排序: 基础算法----插入排序
快速排序: 基础算法----快速排序
希尔排序: 基础算法----希尔排序
归并排序: 基础算法----归并排序
计数排序: 基础算法----计数排序
桶排序: 基础算法----桶排序
基数排序: 基础算法----基数排序
堆排序: 基础算法----堆排序
一 算法稳定性
稳定性是指在一组待排序记录中,如果存在任意两个相等的记录R和S,且排序之前R在S前面,如果在排序后R依然在S前面,即排序前后它们的位置不发生改变,则排序算法是稳定的
稳定的排序算法:冒泡排序、插入排序、折半插入排序、归并排序、计数排序、桶排序、基数排序
不稳定的排序算法: 快速排序、选择排序、希尔排序、堆排序
二 时间复杂度
时间复杂度是指执行算法所需要的时间
常见的时间复杂度有:
常数阶:O(1)
对数阶:O(log2n)
线性阶:O(n)
线性对数阶:O(nlog2n)
平方阶:O(n2)
三 空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,即算法在执行时所需存储空间的度量
常数复杂度:当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)
对数复杂度:当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为O(log2n)
线性复杂度:当一个算法的空间复杂度与n成线性比例关系时,可表示为O(n)
四 算法分类
常见算法可以分为两大类
一) 比较类排序
通过比较来决定元素间的相对次序,其最优时间复杂度不超过O(nlog2n),也称为非线性时间比较类排序
包括 :冒泡排序、快速排序、选择排序、插入排序、希尔排序、归并排序、堆排序
二)非比较类排序
不通过比较来决定元素间的相对次序,可以突破基于比较排序的最优时间复杂度O(nlog2n), 以线性时间运行, 也称为线性时间非比较类排序
包括 :计数排序、桶排序、基数排序
五 几种经典算法算法稳定性,时间复杂度,空间复杂度的对比
算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 说明 | ||
最好 | 最坏 | 平均 | ||||
冒泡排序 | O(n2) | O(n2) | O(n2) | O(1) | 稳定 | n:待排序列长度 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 | n:待排序列长度 |
插入排序 | O(n2) | O(n2) | O(n2) | O(1) | 稳定 | n:待排序列长度 |
希尔排序 | O(n) | O(n2) | O(nlog2n) ~ O(n2) | O(1) | 不稳定 | n:待排序列长度 |
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(log2n)~O(n) | 不稳定 | n:待排序列长度1)每次所选的中间数是当前序列中的最大或最小元素,使得每次划分所得的子表中一个为空表,另一子表的长度为原表的长度-1时,有最坏时间复杂度2)每次划分所选择的中间数恰好将当前序几乎等分时,有最好时间复杂度 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 | n:待排序列长度n大时好,归并比较占用内存,内存随n的增大而增大,但却是效率高且稳定的排序算法 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 | 以空间换时间的算法n: 待排序列长度k: 待排序序列中的最大值k不大场景下,快于任何比较排序算法; 当k>nlogn,其效率不如基于比较的排序(基于比较的排序的最好时间复杂度是O(nlog2n) |
桶排序 | O(n) | O(n+n(log2n-log2m) | O(n+n(log2n-log2m) | O(n+m) | 稳定 | n:待排序序列长度m:桶的个数 当n=m时,有最好的时间复杂度O(n) |
基数排序 | O(kn) | O(kn) | O(kn) | O(k+r) | 稳定 | n:待排序列长度k:最高位数r:基数,即存放元素的桶的数量 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 | n:待排序列长度 |
六 几种算法的对比
1 冒泡排序,选择排序,插入排序时间复杂度都是O(n2),一般情况下排序的效率:插入排序> 选择排序> 冒泡排序
2 小数量的序列场景下,可以使用插入排序,序列中的有序性越高,插入排序的性能越高,因为插入排序比较的次数越少
3 大数量的序列场景下,一般都很少使用冒泡排序,选择排序,插入排序,这三个算法的效率都比较低,大数量场景下,可以考虑:归并排序,快速排序,堆排序
4 归并排序,快速排序,堆排序平均时间复杂度都是O(nlog2n),但快速排序和归并排序是分治法,堆排序基于二叉树,归并排序是稳定的,堆排序,快速排序是不稳定的,归并排序的效率仅次于快速排序
5 快速排序的时间复杂度很大程度上取决基准值,可以通过随机选择基准值,三切分等方法降低最坏情况出现的概率。大多数情况下,快速排序并不会出现最坏情况,大多数快才是真的快
七 算法选择策略
需要基于时间复杂度,空间复杂度,算法稳定性等方面综合考虑:
1 算法稳定性维度:可以选择归并排序,插入排序等稳定的算法
2 空间复杂度维度:可以选择堆排序,比如Linux内核栈小,快速排序占用程序栈太大了,使用快速排序可能栈溢出
3 时间复杂度维度:比较类型的算法最优时间复杂度为 O(nlog2n),非比较排序的最优时间复杂度可以达到 O(n)
4 算法的使用频率
5 处理的数据量的大小