机器学习面试题之——简单总结常见排序算法

思想+时间复杂度+空间复杂度

1、冒泡排序:依次比较和交换相邻的两个数从而把小的数排在前面

     时间复杂度:平均O(n^2),最坏O(n^2),最好O(n)(数据有序的情况下:设置一个标志位,若第一趟交换完成后,没有数据改变位置,则结束后面的交换)。空间复杂度:O(1),稳定

2、选择排序:可看成冒泡排序的优化算法,但只有在确定了是最小数的前提下才交换,所以和1比,大大减少了交换次数

     时间复杂度:平均O(n^2),最坏O(n^2),最好O(n^2)。空间复杂度:O(1),不稳定

3、直接插入排序:通过比较找到合适的位置插入目标元素,在插入一个数时保证这个数前面的数已经有序。

      时间复杂度:平均O(n^2),最坏O(n^2),最好O(n)(数据已经是正确顺序的情况下)。空间复杂度:O(1),稳定

4、希尔排序(缩小增量排序):可看成对3的优化,先将整个待排序序列分割成若干个子序列分别进行直接插入排序,待整个序列基本有序时再对整个序列进行一次直接插入排序。子序列的分割:不是简单的逐段分割,而是将相隔某个增量的序列组成一个子序列,然后依次缩小这个增量。

    时间复杂度:平均O(n^{2})\sim O(nlogn),最坏O(n^2),最好O(n^{1.3})。空间复杂度:O(1),不稳定

5、快速排序:思想来源于冒泡,但不是比较相邻两个数,而是比较和交换较大的数和较小的数,从而达到把小数冒泡到上面的同时还将大数冒泡到下面。

   时间复杂度:平均O(nlogn),最坏O(n^2)(数据已经是正序或者逆序的情况下),最好O(nlogn)。空间复杂度:O(logn)~O(n)(内部是通过一个栈来实现递归,若划分均匀,则递归树高度为O(nlogn),若“偏瘫”,则为O(n)),不稳定

6、归并排序:递归分治的思想,即先递归划分为子问题,然后合并结果。倒着来看就是,先两两合并,再四四合并。

    时间复杂度:平均O(nlogn),最坏O(nlogn),最好O(nlogn)。空间复杂度:O(n),稳定

7、堆排序:思想同2,借助堆这种数据结构输出堆顶元素,从而输出最大值(最小值)。然后将剩余元素重新排成最大堆(最小堆),重复这个过程。

     时间复杂度:平均O(nlogn),最坏O(nlogn),最好O(nlogn)。空间复杂度:O(1),不稳定

另外,注意:

1、快排和归并的空间复杂度:

因为对于归并排序来说,每次递归的时候都会用到一个辅助表,其长度和待排序表相等,虽然递归次数是O(logn),但是每次递归都会释放掉所占的辅助空间,所以下一次递归时的栈空间和辅助空间和这次不想关,即空间复杂度还是O(n)

但快排每次递归都会返回一个中间值的位置,必须使用栈,所以空间复杂度即为栈的深度。

2、稳定性:

稳定性指当待排序序列中存在相等的数,经过排序以后,他们的相对次序没有变

3、适用场景分析:

当序列长度较小时,选择直接插入排序或者选择排序;

          长度较大时,选择时间复杂度为O(nlogn),如:归并、快排、堆排。

当序列基本有序时,选择直接插入排序或者冒泡排序;

           随机分布时,选择快排。

当要求排序稳定时,选择归并,可将直接插入排序和归并常一起用,即先直接插入,得到基本有序序列,然后再两两合并

猜你喜欢

转载自blog.csdn.net/cuiy0818/article/details/81203610
今日推荐