写程序时,排序几乎是绕不开的坎。不管是学生成绩排名、商品价格筛选,还是后台数据处理,总得排个序。可面对冒泡、快排、归并这些名字,很多人脑袋发懵——到底哪个快?哪个省资源?什么时候该用哪个?
为啥需要一张对比图?
前两天帮朋友优化一个订单系统,他用的是冒泡排序,数据量一上来,页面卡得像老拖拉机。其实换种算法,比如快速排序,速度能提升十倍不止。问题就在这儿:不同场景适合不同的排序算法,光背名字没用,得知道它们的脾气。
十大排序算法核心特性一览
下面这张“对比图”不是真图,而是用文字给你理清楚,方便你以后查表对号入座:
- 冒泡排序:稳定,好理解,但慢,适合教学或极小数据
- 选择排序:不稳定,交换次数少,但时间复杂度固定高
- 插入排序:小数据块里表现不错,几乎有序时特别快
- 希尔排序:插入排序的升级版,中等数据量可以考虑
- 快速排序:平均最快,但最坏情况会崩,日常开发常用
- 归并排序:稳定且高效,适合大数据和链表,但吃内存
- 堆排序:时间稳定,不占额外空间,但常数大,实际略慢
- 计数排序:整数排序神器,O(n)速度,但范围不能太大
- 桶排序:数据分布均匀时极快,适合浮点数或分数段统计
- 基数排序:按位比较,适合固定长度的整数或字符串
实际怎么选?看场景
比如你在做考试成绩分析,数据量几千条,基本有序,插进去几个新成绩——这时候插入排序比快排还快。再比如你要处理百万级用户积分排名,数据乱得很,那就上快速排序或者归并排序。
要是数据全是0到100的整数,比如学生成绩,直接上计数排序,一遍扫完就排好了,比啥都快。
代码示例:快速排序简版
来看看快排长什么样:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
写法简洁,平均性能优秀,Python里一句话生成左右子集,理解起来也不费劲。
别被复杂度吓住
看到O(n²)就躲?其实小数据下,算法间的差距没那么夸张。反倒是实现简单、不容易出错更重要。项目赶进度时,先用个简单的排上,后期再优化,比一开始就搞复杂架构实在。
再说一句实在的:面试可以聊堆排序,但平时写业务,90%的情况sort()函数就够用了。关键是心里有张表,知道背后是谁在干活。