十大排序方法:程序员必备的算法利器
写代码时,数据排序几乎无处不在。不管是整理用户积分榜、优化商品价格列表,还是处理后台日志,掌握几种常用的排序方法能让你事半功倍。今天就来盘点一下在实际开发中经常用到的十大排序方法,看看哪些是你每天都在用的。
冒泡排序(Bubble Sort)
最基础的排序方式之一,原理简单:重复遍历数组,比较相邻元素,把大的往后挪。虽然效率不高,但在教学和小数据量场景中很常见。
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}选择排序(Selection Sort)
每次从剩余未排序部分找出最小值,放到已排序序列末尾。实现简单,但时间复杂度固定,适合理解排序逻辑。
插入排序(Insertion Sort)
像打扑克时整理手牌,每拿到一张就插到合适位置。对于小规模或基本有序的数据,表现不俗,很多高级排序在子数组阶段会切换成它。
希尔排序(Shell Sort)
插入排序的升级版,通过设定步长分组预排序,逐步缩小步长最终完成排序。性能比插入排序更稳定,适合中等规模数据。
归并排序(Merge Sort)
采用“分治”思想,把数组一分为二,各自排序后再合并。稳定且时间复杂度始终为 O(n log n),常用于外部排序或多线程环境。
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}快速排序(Quick Sort)
面试常客,也是实际项目中最常用的排序之一。选一个基准值,把小于它的放左边,大于的放右边,递归处理两部分。平均性能极佳,C++ 的 sort() 就基于它。
堆排序(Heap Sort)
利用堆这种数据结构进行排序,尤其是大顶堆。适合需要保证最坏情况性能的场景,比如实时系统中对响应时间有严格要求。
计数排序(Counting Sort)
非比较型排序,适用于整数且范围不大的情况。比如统计考试分数分布、用户等级排序,速度非常快,时间复杂度可达到 O(n + k)。
桶排序(Bucket Sort)
把数据分到多个“桶”里,每个桶内单独排序,最后按序输出。适合处理浮点数或数据分布较均匀的场景,比如电商平台按评分区间展示商品。
基数排序(Radix Sort)
按位数逐位排序,常用于固定长度的整数或字符串排序。比如手机号、身份证号这类数据,不用比较大小也能高效排好。
这些排序方法各有适用场景。日常开发中,STL 的 sort、Java 的 Arrays.sort() 已经帮你封装好了最优策略,但了解底层原理,才能在特殊需求面前不慌。比如嵌入式设备资源紧张,可能就得手动选个轻量级排序;再比如做算法题或性能调优,知道哪个排序在什么情况下表现最好,就是硬实力了。