程序员面试必问系列——各种排序算法比较

Posted ITjob远标培训

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试必问系列——各种排序算法比较相关的知识,希望对你有一定的参考价值。

排序算法是编程中最为广泛应用也是必须要掌握的技能,而且由于其实现代码较短,所以关于排序算法的问题是面试中最常见的。面试过程中,关于排序算法的理解程度直接决定着面试官对你的认可度。

面试中考查最多的是冒泡排序快速排序,往往面试官会要求你现场手写出实现代码,所以同学们一定要经常写写这两个算法。其他常用的排序算法还有插入排序、堆排序、桶排序、归并排序、基数排序等,由于算法种类较多,所以各个算法间的优劣势比较也是考察点。需要对这些算法的实现原理时间复杂度使用场景、稳定性非常熟悉才能从容应对面试官的各种问题。如果排序问题答得不好,可想而知,面试官一定会认为你的编程基础过于薄弱,面试成功率也就大大下降了。

下面就介绍下冒泡排序和快速排序的实现思路,最后会附上各个算法的特点比较。希望对大家能有帮助。(为了方便阐述,本文中默认顺序为由大到小)

  • 冒泡排序:

冒泡算法是最简单的排序算法,其思路是通过相邻元素比较,将较大的元素交换到前面,最终将最大的元素放到第一位。因为过程类似于气泡从水底一直冒到水面而被称为冒泡算法。冒泡算法是基于相邻比较实现的,所以是稳定的,但是需要两两进行比较所以一共会比较n(n-1)/2次,固其时间复杂度为O(n^2)

  • 原理示意图:

程序员面试必问系列——各种排序算法比较

  • 代码实现:

程序员面试必问系列——各种排序算法比较

  • 快速排序:

快排是对冒泡算法的一种改进,使用分治的思想,任意找一个基准数,然后以该基准数为界将小于基准数的元素放到基准数左边,大于基准数的元素放到右边。然后再将左右两边的区域分别进行快排,这里也涉及递归的思想。从上述阐述也可以看出,快排的效率与选取的基准数相关,最理想的情况是每次选取的基准数都恰好能将数组分别两半,这种情况下时间复杂度为O(nlogn);最坏的情况则是选取的基准数是最大或最小的,这种情况下,与冒泡基本一致,时间复杂度为O(n^2)。经过数学证明,快排的平均时间复杂度为O(nlogn)。由于快排交换过程中可能会变换位置,所以快排是不稳定的。

  • 原理示意图:

程序员面试必问系列——各种排序算法比较

  • 代码实现:

下面附上总结的各种排序方法的复杂度、稳定性以及使用场景:


以上是关于程序员面试必问系列——各种排序算法比较的主要内容,如果未能解决你的问题,请参考以下文章

PHP面试题通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序

.net必问的面试题系列之面向对象

面试必问:十大经典排序算法总结

面试必问系列:谈谈乐观锁与悲观锁!

面试必问的冒泡排序,原来这么回答就可以满分了-0907

彻底剖析JVM类加载机制系列,面试必问!