冒泡排序
稳定的,一开始正序的话,不需要交换,但是也要比较固定次数。逆序比较和交换次数最多。
冒泡优化:可以设置一个标记位,如果某次循环中有交换出现,就把标记位置为1,如果标记位是0的话直接退出(说明剩下的都有序)。
选择排序
每次循环找到最小的一位位置,遍历一边后交换。选择排序不稳定!一开始正序的话,还是要全部遍历比较。逆序的话交换次数不是最多。
优化方法:一趟中既选出最小值,也选出最大值,交换两个位置。
插入排序
假定前面部分都排好序,把每一个元素在已排数组中从后往前找合适位置。插入排序是稳定排序!因为移动耗时高,时间复杂度也是n方。一开始有序的话,也要进行全部比较。逆序的话移动次数最多。
优化方法:在寻找方面使用二分查找,减少比较次数;每次多拿几个元素一起插入;数据链表化,可以精准插入,不用移动这么多次。不过这些都是n方复杂度。还有一个希尔排序,理解就行。
希尔排序,对插入排序的改进方法。分多个间隔的插入排序。减少移动元素的次数,和查找的次数。时间复杂度突破n方,但是如果采用步长为长度一半的方法的话,最坏也是n方,具体跟选择步长有关,下界是nlogn。不是稳定排序。
快速排序
就是挖坑填数加分治。不稳定的。在选择的基准值为最值的时候退化为n方复杂度。
优化方法:更合理的基准数,可以从多个数中选中值,避免选到极值。结合插入排序,当序列数少于10时,用插入排序做。
归并排序
将两个有序的子数列合并,将每个数看成一个子序列,然后不断两两组合归并排序。时间复杂度nlogn,归并排序稳定。局部有序时交换次数比较小。(明天看看代码)
计数排序
复杂度n+k,稳定。要求必须是整数,且元素比较集中。
优化方法:记录最小值和最大值,类似操作系统内存装入时冲定位寄存器。
桶排序
准备几个桶,按最高位数放到桶里单独排序。根据每个桶的排序算法不同,时间复杂度和稳定性不一定。分布要比较均匀,
基数排序
分别按个位十位百位的数字分配到好几轮桶中,比如按个位分配到十个桶,然后按十位分配到十个桶等等,然后拿出按个位排的顺序,再放到十位桶,再按顺序拿出来,再放到百位桶………最后拿出来就是有序的,而且稳定。时间复杂度nk,稳定。