前言
自学了一年JAVA阿巴阿巴终于约到了面试,然而这次面试官让她谈谈对排序算法的理解。
面试官: 你对算法这一块了解吗?排序这一块了解吗?
阿巴阿巴: 了解一点,排序算法这一块主要有冒泡排序、插入排序、希尔排序、选择排序、快速排序、归并排序、堆排序、基数排序、桶排序。
面试官: 很不错,那你知道什么是稳定性吗,这些算法都是稳定的吗?他们的复杂度分别是多少呀?
阿巴阿巴: 稳定性就是说,如果有2个元素a和b,且 a = b,且a排在b前面,如果经过排序算进行排序后,b在a前面了,那么我们就说这个算法是不稳定的,这就是稳定性。不稳定的算法有快速排序、选择排序、希尔排序、堆排序。俗称‘快选希堆’。
阿巴阿巴: 如下图(狗头),可以看到平均性能为O(nlogn)的有:快速排序,归并排序,堆排序,这些排序算法时间复杂度低,适合大数据集排序,当然时间复杂度高的排序算法也有自己的用武之地的。
面试官: 讲一下你知道的算法的使用场景呗
阿巴阿巴:
冒泡排序适合: 适用于数据量不大,且要求排序稳定,数据量本身基本有序的情况。
选择排序适合: 当数据量不大且对于稳定性没有要求的情况(相对冒泡排序来说减少了交换次数)。
插入排序适合: 适合于数据量不大,对算法稳定性有要求,局部有序或整体相对有序的情况。
归并排序适合: 数据比较大,且对算法稳定性有要求的情况。
快速排序适合: 数据量大,且数据较为分散,且对稳定性没啥要求的情况。
堆排序适合: 数据量大,对稳定性没要求的情况。
希尔排序: 希尔排序是对直接插入排序的一种优化,可以用于大型的数组,希尔排序比插入排序和选择排序要快的多,并且数组越大,优势越大。
基数排序适合: 适合数据集中,没有特别大的数据,对算法要求稳定的场景。
桶排序适合: 适合数据比较集中的,对算法要求稳定的场景。
面试官: 好的,看你是有备而来,那我问个冷门点的,可以给我详细介绍下基数排序和桶排序吗?
阿巴阿巴: 基数排序属于“分配式排序”,又称“桶子法”或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。比如说有一批数据[31,19,46,23,17],那么先按照“个”位上的数值进行排序,放进下面的桶中。