-
分享
排序方法(比较排序)
-
小曾老师
SU
@
2025-2-28 14:38:58
一、排序算法对比表
特性 |
冒泡排序 |
插入排序 |
选择排序 |
时间复杂度 |
O(n²) |
O(n²)(最优O(n)) |
O(n²) |
空间复杂度 |
O(1) |
稳定性 |
稳定 |
不稳定 |
最佳场景 |
基本有序的小数据集 |
部分有序的数组 |
数据量较小 |
交换次数 |
最多(每次逆序都交换) |
较少(仅移动元素) |
固定n-1次交换 |
二、修正后的标准实现
1. 冒泡排序(Bubble Sort)
void bubble_sort(int a[],int n){//稳定
for(int i=1;i<n;i++){
for(int j=1;j<=n-i;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
}
}
}
}
2. 插入排序(Insertion Sort)
void insert_sort(int a[],int n){//稳定
for(int i=2;i<=n;i++){
int key =a[i];
int j=i-1;
while(j>=1&&a[j]>key){
a[j+1]=a[j];
j--;
}
a[j+1]=key;
}
}
3. 选择排序(Selection Sort)
void select_sort(int a[],int n){//不稳定
for(int i=1;i<=n;i++){
int k=i;
int j;
for(j=i+1;j<=n;j++){
if(a[k]>a[j]){
k=j;
}
}
swap(a[k],a[i]);
}
}
三、经典应用场景
场景 |
推荐算法 |
理由 |
数据基本有序 |
插入排序 |
接近O(n)时间复杂度 |
需要稳定排序 |
冒泡/插入排序 |
选择排序不稳定 |
内存严格受限 |
选择排序 |
交换次数最少(适合Flash存储设备) |
教学演示 |
冒泡排序 |
算法逻辑最简单直观 |
四、可视化过程对比
冒泡排序(相邻元素比较交换):
初始:5 3 8 6 4
第1轮:3 5 6 4 [8]
第2轮:3 5 4 [6 8]
第3轮:3 4 [5 6 8]
第4轮:3 [4 5 6 8]
插入排序(逐步构建有序序列):
初始:5 |3 8 6 4
步骤1:3 5 |8 6 4
步骤2:3 5 8 |6 4
步骤3:3 5 6 8 |4
结果:3 4 5 6 8
选择排序(选择最小元素前移):
初始:5 3 8 6 4
第1轮:[3] 5 8 6 4
第2轮:[3 4] 8 6 5
第3轮:[3 4 5] 6 8
第4轮:[3 4 5 6] 8