十大排序算法对比图:程序员出行前必看的效率指南

坐高铁时,邻座实习生正对着笔记本皱眉,屏幕里满是各种排序代码。我瞄了一眼,忍不住问:‘冒泡排序写到第几遍了?’他苦笑:‘快十遍了,还是超时。’其实啊,就像出门旅行要选对路线,写代码也得挑对算法

排序算法就像出行方式

你不会为了去三站地外的便利店打飞的,也不会徒步穿越整个省去看演唱会。排序也一样——数据量小的时候,冒泡排序像步行,慢点但能搞定;可要是上万条订单要处理,就得上‘高铁’级别的归并或快排。

十大排序算法横向对比

下面这张脑内地图,就是程序员的“高德导航”:

算法         平均时间   最坏情况   空间复杂度   稳定性   适用场景
冒泡排序  O(n²)  O(n²)  O(1)  稳定  教学演示
选择排序  O(n²)  O(n²)  O(1)  不稳定  内存极小时
插入排序  O(n²)  O(n²)  O(1)  稳定  近乎有序数据
希尔排序  O(n log n) O(n²)  O(1)  不稳定  中等规模数据
归并排序  O(n log n) O(n log n) O(n)  稳定  要求稳定且高效
快速排序  O(n log n) O(n²)  O(log n)  不稳定  通用主力
堆排序  O(n log n) O(n log n) O(1)  不稳定  内存紧张时
计数排序  O(n+k)  O(n+k)  O(k)  稳定  整数且范围小
桶排序  O(n)  O(n²)  O(n+k)  稳定  分布均匀数据
基数排序  O(nk)  O(nk)  O(k)  稳定  多关键字排序

什么时候该用哪种?

就像从北京到上海,你可以坐高铁、飞机或者自驾。数据量小于50,插入排序足够快,就像短途骑个共享单车最方便。上万条用户评分要排序?快排是首选,相当于订张高铁票,又快又稳。如果还要求顺序绝对不能乱(比如银行交易记录),那就得上归并排序,哪怕多花点内存,也得买张“准点+靠窗”的票。

有次朋友做物流系统,用冒泡排序处理十万条配送单,程序跑了一分钟还没出结果。换成快排后,两秒搞定。这就像本来打算骑自行车跨城送快递,换了辆顺丰货车。

别被最坏情况坑了

快排平均很快,但遇到已经有序的数据,性能会暴跌到 O(n²),就像高速突然堵死。这时候随机化 pivot 或者切换到堆排序,相当于导航提醒你“前方事故,建议绕行”。

计数排序在处理年龄、分数这类小范围整数时飞快,但你要给手机号排序,就得准备几十亿个桶——内存直接爆表,跟带十个行李箱出差一样不现实。

算法没有绝对好坏,只有合不合适。下次写排序前,先问问自己:我的数据多大?要不要保持原有顺序?内存够不够?就像出发前查天气、定路线,心里才有底。