发布于2026-07-09 阅读(0)
扫一扫,手机访问
冒泡排序在教科书里总是作为“最基础”的排序算法被一笔带过,但真要深挖它对内存带宽的消耗规律,你会发现很多有意思的细节——真正决定压力的并不是交换次数本身,而是**访问模式引发的缓存行回写、跨行双重加载以及写放大**。下面我们用实测数据把这件事说明白。

Ja va 数组天然支持原地操作,冒泡排序的核心逻辑就是相邻元素反复比较与交换:
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 一次交换:3 次读 + 2 次写(含临时变量)
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
这里有个容易被忽略的细节:每次 swap 涉及对同一 cache line 内两个 int 的读写(假设 64 字节 cache line 可容纳 16 个 int)。如果两个元素恰好在同一行,实际内存带宽消耗会远小于跨行访问的情况。
冒泡排序的带宽压力跟算法复杂度 O(n²) 没有直接关系,真正主导的是以下三点:
对 1MB int 数组(256K 元素)运行冒泡排序,用 perf 监控 L3 缓存未命中和 DDR 总线流量,可以观察到:
如果出于教学或嵌入式极简场景不得不使用冒泡排序,可以微调几个地方来减少无效访存:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8