早上赶地铁的时候,队伍乱糟糟的,有人插队,有人站错位置。如果能把所有人按身高从矮到高排个序,是不是就井然有序了?这其实就是排序——把一堆无序的数据重新排列成特定顺序的过程。
冒泡排序:最基础的入门法
想象你在整理一排书,相邻两本如果顺序不对,就交换位置。冒泡排序就是这样,一遍遍扫描列表,每次把最大的那个“浮”到最后。
虽然效率不高,但逻辑简单,适合初学者理解排序的基本思想。
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
选择排序:每次都挑最小的
就像你每天挑衣服,总想选最合适的那件。选择排序每轮都在未排序部分找出最小值,放到已排序部分的末尾。
它不像冒泡那样频繁交换,而是记录位置再交换,代码更干净一点。
插入排序:像打扑克时理牌
你抓了一手牌,习惯性地一边摸牌一边调整顺序。插入排序就是这么干的:每次取出一个元素,插入前面已经排好序的部分中合适的位置。
数据量小或者接近有序时,它表现挺不错。
归并排序:分而治之的稳定派
面对一大叠发票要排序,你可以把它分成两半,各自排好,再合并起来。归并排序用的就是这个思路——递归拆分,再有序合并。
它的优势在于稳定性强,时间复杂度始终是 O(n log n),适合处理大量数据。
快速排序:效率之王
找个基准数,比它小的放左边,大的放右边,然后对左右两边递归操作。快排的核心在于“分区”,平均情况下速度最快。
你写个小程序处理几千条用户数据,用快排基本秒出结果。
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 的 sorted() 和 JavaScript 的 sort() 都是混合策略,底层可能是快排、Timsort 这类优化过的算法。
理解这些排序方法,不只是为了应付面试题。当你在处理表格、筛选商品价格、甚至安排日程时,脑子里有这些逻辑,写代码自然更顺。