思想+时间复杂度+空间复杂度
1、冒泡排序:依次比较和交换相邻的两个数从而把小的数排在前面
时间复杂度:平均,最坏,最好(数据有序的情况下:设置一个标志位,若第一趟交换完成后,没有数据改变位置,则结束后面的交换)。空间复杂度:,稳定
2、选择排序:可看成冒泡排序的优化算法,但只有在确定了是最小数的前提下才交换,所以和1比,大大减少了交换次数
时间复杂度:平均,最坏,最好。空间复杂度:,不稳定
3、直接插入排序:通过比较找到合适的位置插入目标元素,在插入一个数时保证这个数前面的数已经有序。
时间复杂度:平均,最坏,最好(数据已经是正确顺序的情况下)。空间复杂度:,稳定
4、希尔排序(缩小增量排序):可看成对3的优化,先将整个待排序序列分割成若干个子序列分别进行直接插入排序,待整个序列基本有序时再对整个序列进行一次直接插入排序。子序列的分割:不是简单的逐段分割,而是将相隔某个增量的序列组成一个子序列,然后依次缩小这个增量。
时间复杂度:平均,最坏,最好。空间复杂度:,不稳定
5、快速排序:思想来源于冒泡,但不是比较相邻两个数,而是比较和交换较大的数和较小的数,从而达到把小数冒泡到上面的同时还将大数冒泡到下面。
时间复杂度:平均O(nlogn),最坏(数据已经是正序或者逆序的情况下),最好O(nlogn)。空间复杂度:O(logn)~O(n)(内部是通过一个栈来实现递归,若划分均匀,则递归树高度为O(nlogn),若“偏瘫”,则为),不稳定
6、归并排序:递归分治的思想,即先递归划分为子问题,然后合并结果。倒着来看就是,先两两合并,再四四合并。
时间复杂度:平均O(nlogn),最坏O(nlogn),最好O(nlogn)。空间复杂度:,稳定
7、堆排序:思想同2,借助堆这种数据结构输出堆顶元素,从而输出最大值(最小值)。然后将剩余元素重新排成最大堆(最小堆),重复这个过程。
时间复杂度:平均O(nlogn),最坏O(nlogn),最好O(nlogn)。空间复杂度:,不稳定
另外,注意:
1、快排和归并的空间复杂度:
因为对于归并排序来说,每次递归的时候都会用到一个辅助表,其长度和待排序表相等,虽然递归次数是O(logn),但是每次递归都会释放掉所占的辅助空间,所以下一次递归时的栈空间和辅助空间和这次不想关,即空间复杂度还是。
但快排每次递归都会返回一个中间值的位置,必须使用栈,所以空间复杂度即为栈的深度。
2、稳定性:
稳定性指当待排序序列中存在相等的数,经过排序以后,他们的相对次序没有变
3、适用场景分析:
当序列长度较小时,选择直接插入排序或者选择排序;
长度较大时,选择时间复杂度为O(nlogn),如:归并、快排、堆排。
当序列基本有序时,选择直接插入排序或者冒泡排序;
随机分布时,选择快排。
当要求排序稳定时,选择归并,可将直接插入排序和归并常一起用,即先直接插入,得到基本有序序列,然后再两两合并