知用网
柔彩主题三 · 更轻盈的阅读体验

快速排序和归并排序哪个快(进阶教程)

发布时间:2025-12-15 04:20:06 阅读:6 次
{"title":"快速排序和归并排序哪个快","content":"

说到排序算法,快速排序和归并排序是程序员最常碰上的两个“老熟人”。在实际开发中,比如处理一批用户登录日志按时间排序,或者对商品价格做升序展示,选哪个排序方法更高效?很多人会纠结:到底哪个更快?

\n\n

平均情况下的表现

\n

从理论上看,快速排序的平均时间复杂度是 O(n log n),归并排序也是 O(n log n)。光看这个数字,好像俩人打了个平手。但别忘了,算法不只是看“数学成绩”,还得看“实战发挥”。

\n\n

快速排序在大多数情况下比归并排序快,原因在于它的常数因子更小,而且是原地排序,不需要额外开辟内存空间。比如你在一台配置一般的服务器上处理10万条订单数据,快速排序往往跑得更利索,内存占用也低。

\n\n

最坏情况谁更扛得住

\n

但快速排序有个“软肋”——如果每次选的基准值(pivot)都特别不巧,比如数组已经有序,那它就会退化到 O(n²) 的性能。这时候归并排序就稳多了,不管数据怎么乱,它始终能保持 O(n log n) 的节奏。

\n\n

举个例子,你写了个后台接口,用来排序用户提交的时间戳列表。万一有人故意传个逆序的大数组过来,快速排序可能直接卡住,而归并排序还能淡定处理。

\n\n

稳定性和使用场景

\n

归并排序是稳定的,相同元素的相对位置不会改变。这在某些业务里很重要。比如你按成绩给学生排名,分数一样的学生,得按学号顺序排。这时候用归并排序更靠谱。

\n\n

而快速排序默认不稳定,虽然可以改造,但会牺牲效率。所以对稳定性有要求的场景,归并排序天然占优。

\n\n

代码实现对比

\n

下面是两种排序的简单实现:

\n\n
// 快速排序\nvoid quickSort(int arr[], int low, int high) {\n    if (low < high) {\n        int pi = partition(arr, low, high);\n        quickSort(arr, low, pi - 1);\n        quickSort(arr, pi + 1, high);\n    }\n}\n\nint partition(int arr[], int low, int high) {\n    int pivot = arr[high];\n    int i = (low - 1);\n\n    for (int j = low; j <= high - 1; j++) {\n        if (arr[j] <= pivot) {\n            i++;\n            swap(&arr[i], &arr[j]);\n        }\n    }\n    swap(&arr[i + 1], &arr[high]);\n    return (i + 1);\n}\n
\n\n
// 归并排序\nvoid mergeSort(int arr[], int l, int r) {\n    if (l < r) {\n        int m = l + (r - l) / 2;\n        mergeSort(arr, l, m);\n        mergeSort(arr, m + 1, r);\n        merge(arr, l, m, r);\n    }\n}\n\nvoid merge(int arr[], int l, int m, int r) {\n    // 合并逻辑省略,需额外空间\n}\n
\n\n

可以看到,归并排序需要额外的数组空间来合并,而快速排序直接在原数组上操作,更节省内存。

\n\n

实际选择看需求

\n

如果你追求平均速度,数据分布比较随机,快速排序通常是首选。像 C++ 的 std::sort 就是以快速排序为基础优化的。

\n\n

但如果你处理的是外部数据,不能保证输入质量,或者要求排序必须稳定、性能不能波动,那就该考虑归并排序。Java 中的 Arrays.sort() 对对象数组就用了归并排序的变种。

\n\n

说到底,没有绝对的“谁更快”,只有“谁更适合”。就像开车,高速上跑轿车快,泥巴路就得换越野车。算法也一样,看场合用才最有效。”,"seo_title":"快速排序和归并排序哪个快?一文说清楚","seo_description":"快速排序和归并排序在不同场景下各有优势,本文通过实际例子对比两者的性能、稳定性与适用场景,帮你选出更适合的排序方法。","keywords":"快速排序,归并排序,排序算法,快速排序和归并排序哪个快,算法性能对比"}