排序算法性质分析
折半插入排序希尔排序堆排序归并排序
排序直接插入排序快速排序冒泡排序简单选择排序二路插入排序排序О(n2)希尔增量О(n2)O(nlogn)O(nlogn)
平均时间复杂度
О(n2)O(nlogn)О(n2)О(n2)О(n2)O(1)借助大小根堆O(1)
O(n)
辅助空间O(1)
O(1)(栈开销O(logn))
O(1)O(1)O(1)O(n)不稳定不稳定稳定
稳定性稳定不稳定稳定不稳定稳定稳定/O(nlogn)O(nlogn)
最优时间O(n) O(nlogn)O(n) О(n2)O(n log n)
/最坏时间О(n2)О(n2)О(n2)О(n2)О(n2)O(nlogn)O(nlogn)
О(n2)О(n2)
坏时间时间复杂度初始数据相关性(n2)逆序比较和移动次数多(n2)有关,有序反而麻烦(n2)正序好,逆序显著增大
(n2)无关
(n2)逆序比较次数稍多移动次数多第i趟确定第i小的数与第i个位置的数交换logn)无关logn)
无关
(n2)有关且与增量序列有关
a[1]最小时退化为直插(n2)临时“循环”数组的a[1]左右直接插入主要算法思想
优点或适用情况
边依次比较边后移,合适位置插入
每趟使得枢轴左边小右边大
相邻元素不断交换使得第i趟取第i大放在倒数第i上
基本有序速度快效率比较低简单直观
基本有序、n非常
减少了移动次数,但内
边折半比较边后移,合适位置插入
根据希尔增量(除半取奇)分组,组内直接插入排序
大(小)根堆的调整递归和分治的思想
速度较快但内存占
插入排序高速稳定的改进,
比较快,适用于n大
用情况有序快较低直观
、n非常大
,但内存占用多备注平均移动n2/4递归左边找大右边找小
设置旗标判断是否已经有序
共需n-1趟平均移动n2/8类似完全二叉树递归深度为log2n
内存占用多
平均移动n2/4增量的选取改进,不适合链表
于n大的情况