每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
即边插入边排序,保证子序列中随时都是排好序的
直接插入排序—基于顺序查找
折半插入排序—基于折半查找
希尔排序—基于逐趟缩小增量
整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。
时间复杂度:O(n²)
空间复杂度:O(1)
是一种稳定的排序方法
它所需要的关键码比较次数与待排序对象序列的初始排列无关,仅依赖于对象个数。在插入第 i 个对象时,需要经过 [ log₂i ] +1 次关键码比较,才能确定它应插入的位置 。
时间复杂度: O(n²)
空间复杂度:O(1)
是一种稳定的排序方法
先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
子序列的构成不是简单地“逐段分割”将相隔某个增量dk的记录组成一个子序列让增量dk逐趟缩短(例如依次取5,3,1)直到dk=1为止。
小元素跳跃式前移,最后一趟增量为1时,序列已基本有序。平均性能优于直接插入排序
时间复杂度时n和d的函数
O(n1.25)~O(1.6n1.25) --经验公式
空间复杂度:O(1)
是一种不稳定的排序方法
两两比较,如果发生逆序则交换,直到所有记录都排好序为止。
起泡排序O(n²)
快速排序O(n log₂n)
每趟不断将记录两两比较,并按“前小后大” 规则交换
每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素
一旦下趟没有交换,还可提前结束排序
时间复杂度: O(n²)
空间复杂度: O(1)
是一种稳定的排序方法
时间复杂度: O(n log₂n )
每趟确定的元素呈指数增加
空间复杂度: O(log₂n)
递归要用到栈空间
不稳定–可选任一元素为支点
每一趟在后面 n-i +1个中选出关键码最小的对象, 作为有序序列的第 i 个记录
时间复杂度: O(n²)
空间复杂度 :O(1)
稳定
简单选择排序没有利用上次选择的结果,是造成速度慢的重要原因。如果,能够加以改进,将会提高排序的速度。
时间复杂度 :O(n log₂n)
空间复杂度 :O(1)
稳定性: 不稳定
适用于n较大的情况
时间效率 :O(n log₂n)
空间效率 :O(n)
稳定性 :稳定
知道各级关键字的主次关系
知道各级关键字的取值范围
n个记录
每个记录有 d 位关键字
关键字取值范围rd(如十进制为10)
重复执行d趟“分配”与“收集”
每趟对 n 个记录进行“分配”,对rd个队列进行“收集”
需要增加n+2rd个附加链接指针。
时间效率:O(d( n+rd))
空间效率:O(n+rd)
稳 定 性:稳定