坐高铁时,邻座实习生正对着笔记本皱眉,屏幕里满是各种排序代码。我瞄了一眼,忍不住问:‘冒泡排序写到第几遍了?’他苦笑:‘快十遍了,还是超时。’其实啊,就像出门旅行要选对路线,写代码也得挑对算法。
排序算法就像出行方式
你不会为了去三站地外的便利店打飞的,也不会徒步穿越整个省去看演唱会。排序也一样——数据量小的时候,冒泡排序像步行,慢点但能搞定;可要是上万条订单要处理,就得上‘高铁’级别的归并或快排。
十大排序算法横向对比
下面这张脑内地图,就是程序员的“高德导航”:
算法 平均时间 最坏情况 空间复杂度 稳定性 适用场景
冒泡排序 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 或者切换到堆排序,相当于导航提醒你“前方事故,建议绕行”。
计数排序在处理年龄、分数这类小范围整数时飞快,但你要给手机号排序,就得准备几十亿个桶——内存直接爆表,跟带十个行李箱出差一样不现实。
算法没有绝对好坏,只有合不合适。下次写排序前,先问问自己:我的数据多大?要不要保持原有顺序?内存够不够?就像出发前查天气、定路线,心里才有底。