排序算法

重点 时间复杂度 稳定性
直接插入排序 将待插入元素插入到已有序序列中的某个合适位置,得到新有序序列 最坏情况下O(n*n) Y
折半插入排序 在决定当前元素插入位置时不采用插入查找的方式,而是二分查找 相比直接插入,比较的次数明显减半,但移动的次数没有减少。所以还是O(n*n) Y
二路插入排序 目标是减少移动的次数,准备一个等长度空数组,将第一个元素先放入首位,下一个待插入元素先于该首位做比较,如果小于它则从后往前放,如果大于它则从前往后放。 移动次数减半,直接插入的平均复杂度O(n*n/4),现在减少为O(n*n/8) Y
希尔排序 一般设置增量序列为{n/2,n/2/2,..1},每次的增量d将待排序列分成d组,组内元素间隔为d。每一组都使用插入排序排好,最后只剩下1组时就完成了。

因为前step个元素都是各组内首元素,所以外层循环从step+1到n依次遍历待插入元素。由于增量序列的选取,时间下界可以达到O(n*logn)

N(每一组内都会进行插入排序,不保证相等元素的相对位置)
冒泡排序 基于交换的排序 O(n*n) Y
快速排序 每次返回基准的位置并将待排序列分成小于基准和大于基准两部分 O(n*logn) N(如A\B两个数相等,规定基准前的数是小于等于的数,基准后是大于的数,那么如果基准选择了A,则B会放到前面去。是基准的选择的不确定性导致了不稳定的可能)
直接选择排序 每i趟从待排序列中选择一个最小的元素与第i个位置的元素交换 O(n*n) N(如5、8、5、2、9)
堆排序 包括建堆和维护堆两部分,它们都是基于一个筛选的功能O(logn)(可以把[root+1...last]的堆更新为一个[root...last]的堆,即把较大的数筛至底部) O(n*logn) N
树形选择排序 竞标赛选举机制,将待排序序列作为叶子结点,这样就可以将最小的元素选举到堆顶,第一次弹出堆顶得最小元素,然后将相应叶子结点置∞,再推举上来(只要比较logn个数)得到次小数。 O(n*logn),但是它比堆排序要更加浪费空间 Y(两个相等的元素肯定会被比较,只要规定取左结点为优秀者便可以保持稳定)
归并排序 将两个有序序列合并为一个有序序列 O(n*logn),logn是归并趟数,  n是每趟的比较次数 Y
基数排序 按位数来排序,从低位到高位 O(d*n),d是最长位数 Y

插入排序

各类排序算法比较

希尔排序

各类排序算法比较

分类:

技术点:

相关文章: