排序算法是一类非常经典的算法,说来简单,说难也难。刚学编程时大家都爱用冒泡排序,随后接触到选择排序、插入排序等,历史上还有昙花一现的希尔排序,公司面试时也经常会问到快速排序等等,小小的排序算法,融入了无数程序大牛的心血。
排序算法在生活中的应用非常广泛,比如:
在学校时,每位学生的考试成绩会按照降序排出名次
在电商领域,需要按照出单量排序,快速找出销量领先的商品
在游戏清算时,根据用户的表现分评选出 MVP
在不同领域,排序算法的实现各有千秋。总体来看,排序算法大致可分为十类:
选泡插:选择排序、冒泡排序、插入排序
快归希堆:快速排序、归并排序、希尔排序、堆排序
桶计基:桶排序、计数排序、基数排序
虽然工作中很少需要我们手打排序算法,只需要调用基础库中的 Arrays.sort() 便可解决排序问题。但你可曾静下心来,阅读 Arrays.sort() 背后的原理,它是采用了哪种排序算法呢?
事实上,Arrays.sort() 函数并没有采用单一的排序算法。Java 中的 Arrays.sort() 函数是由 Java 语言的几位创始人编写的,这个小小的函数逻辑严密,并且每个步骤都被精心设计,为了最大化性能做了一层又一层的优化,根据数据的概况采用双轴快排、归并或二分插入算法完成排序,堪称工业级排序算法的典范,理清之后其乐无穷。
并且,排序算法深受面试官的喜爱,在人才招聘时,总是将排序算法作为程序员的基本功来考察。对排序算法的理解深度在一定程度上反映了程序员逻辑思维的严谨度。攻克排序算法的难关是每位程序大牛的必经之路。
如牛顿所言,正是站在巨人的肩膀上,我们才能望得更远。本系列文章我们就来一起梳理一下排序算法的前世今生。