你有没有遇到过这种情况:公司服务器每天生成大量用户操作日志,需要按时间顺序归档备份。但日志量太大,普通排序方法慢得像老牛拉车,备份任务总拖到凌晨还没跑完。
为什么选计数排序?
这些日志的时间戳其实有个特点——集中在24小时内,也就是0到86399秒之间。这种有限范围的整数数据,正好是计数排序的强项。
它不靠比较元素大小,而是直接统计每个值出现的次数。比如你有1000条记录,时间戳都在1到100之间,那就开个长度为101的数组,遍历一遍日志,把每个时间戳对应的位置加1。最后按顺序读出来,自然就是排好序的。
代码实现很简单
def counting_sort(arr, max_val):
count = [0] * (max_val + 1)
for num in arr:
count[num] += 1
sorted_arr = []
for i, freq in enumerate(count):
sorted_arr.extend([i] * freq)
return sorted_arr
假设你要备份一批传感器采集的数据,采样频率固定,数值范围已知。用这个方法,排序速度比快排还快一大截,备份窗口缩短了,运维同事终于能准点下班。
适用场景要认清
这算法不是万能钥匙。如果数据范围太大,比如排序身份证号,那计数数组会大到内存撑不住。但它特别适合处理状态码、评分、年龄这类小范围整数。
在做日志归档、监控数据压缩备份时,先看看原始数据的分布。要是数值集中且跨度小,试试计数排序,说不定能让整个备份流程提速一倍。
有时候解决问题不需要最复杂的工具,而是刚好合适的那个。就像家里修水管,不需要起重机,一把扳手就够了。