归并:
先把一组数据拆分成单个的个体,然后然后按照从小到大的顺序两两合并成新个体,合并结束后需要复制到临时空间中,继续对临时空间的新个体两两合并,合并后的结果又复制回原空间中,此过程反复进行,最后的有序结果还需要重新赋值给原空间
归并排序使用了额外的内存空间,因此避免了数据之间交换的耗时,但是是一种典型的以空间换时间的算法
时间复杂度:O(nlogn)
稳定的
堆:
把数据当作一棵完全二叉树,然后树中的数据调整成大根堆,然后把根节点的数据交换到数组的末尾,然后数量-1,接着调整成新的大根堆,重复以上操作,直到数量为1时结束,可以递归实现也可以循环实现
时间复杂度:O(nlogn)
不稳定的
计数:
找出数据中的最大值和最小值,创建哈希表,用 数据-最小值 作为下标标记哈希表中的对应位置,然后遍历整个哈希表,如果哈希表中的值>1时,通过下标+最小值,还原数据放回数组中
是一种典型的以空间换时间的排序算法,该算法理论上的速度非常快,因为它是一种非基于交换的排序,在一定的范围内对非负整数排序时快于任意一种基于比较交换的排序,但是只适合非负整数,而且数据之间的差值不宜过大,否则非常浪费内存,反之,数据在范围内越均衡、重复数越多,性价比越高
时间复杂度:O(n+k)(k是待排序的整数的范围)
稳定的
桶排序:
把数据根据值的特点,存储到不同的桶中,然后调用其他的排序函数,对桶中的数据进行排序,然后再按照桶的顺序拷贝回原数组中
目的是为了降低排序的规模来提高排序的效率,也是一种用空间换时间的算法
缺点:如何分桶、桶定义的范围,这些都需要对待排序的数据有一定了解
时间复杂度:O(n+k)(k与桶的数量有关)
稳定的
基数排序:
是桶排序这种思想的具体实现,首先创造10个队列,然后逆序计算出每个数据的个、十、百。。。位,然后根据计算出来的每位的值,压入对应的队列中,然后再从所有队列中弹出数据回到数组中,这是根据某一位数据的值压入队列的结果,数据的下一位继续重复此操作,最大值的位数即循环次数
也是一种用空间换时间的算法
缺点:只适合排序正整数数据,要申请十个队列结构
时间复杂度:O(n+k)(k与桶的数量有关)
稳定的
作业:
统计十种排序算法:
排序 最优 最差 平均 空间复杂度 特点 是否稳定
做总结