4-26记录(学习通排序测试)
快速排序
基数排序
1.插入排序
原理
将未排序元素逐个插入已排序部分的正确位置。
每插入一个元素就要和前面的比然后放到合适的位置
-
时间复杂度:
-
最优(已有序):O(n)
-
最差(逆序):O(n²)
-
-
空间复杂度:O(1)(原地排序)
-
稳定性:✅ 稳定
适用场景
-
小规模数据(n < 100)或基本有序序列。
-
实际应用:作为快速排序或归并排序的子过程优化。
2.希尔排序(隔几个数为一组)
-
空间复杂度:O(1)
-
稳定性:❌ 不稳定
设初始数组为 [9, 8, 7, 6, 5, 4]
,我们以初始增量 gap = len(arr) // 2 = 3
开始进行希尔排序,具体步骤如下:
-
初始状态和第一次分组(
gap = 3
):- 初始数组:
[9, 8, 7, 6, 5, 4]
- 分为三组:
- 第一组:
[9, 6]
(间隔为 3) - 第二组:
[8, 5]
(间隔为 3) - 第三组:
[7, 4]
(间隔为 3)
- 第一组:
- 对每组进行插入排序:
- 第一组:
[6, 9]
- 第二组:
[5, 8]
- 第三组:
[4, 7]
- 第一组:
- 此时数组变为:
[6, 5, 4, 9, 8, 7]
- 初始数组:
-
第二次分组(
gap = 3 // 2 = 1
):- 此时相当于进行普通的插入排序(因为增量为 1)。
- 从第二个元素
5
开始,5
比6
小,交换位置,数组变为[5, 6, 4, 9, 8, 7]
。 - 处理第三个元素
4
,4
比6
小,继续向前比较,4
比5
小,交换位置,数组变为[4, 5, 6, 9, 8, 7]
。 - 处理第四个元素
9
,9
比6
大,位置不变,数组还是[4, 5, 6, 9, 8, 7]
。 - 处理第五个元素
8
,8
比9
小,交换位置,8
继续向前比较,8
比6
大,位置不变,数组变为[4, 5, 6, 8, 9, 7]
。 - 处理第六个元素
7
,7
比9
小,交换位置,7
继续向前比较,7
比8
小,交换位置,7
比6
大,位置不变,数组变为[4, 5, 6, 7, 8, 9]
。
3.快速排序:
选择枢轴(一般选第一个,两个指针,指向第一个为low,比枢轴小的放在low左边;指向最后一个的为high,比枢轴大的放在high右边,移动指针
-
时间复杂度:
-
平均:O(n log n)
-
最差(有序输入):O(n²)
-
-
空间复杂度:O(log n)(递归栈)
-
稳定性:❌ 不稳定
适用场景
-
大规模随机数据(实际最快)。
4. 简单选择排序
每轮选择未排序部分的最小值,放到已排序部分的末尾,
-
时间复杂度:O(n²)(始终需完全扫描)
-
空间复杂度:O(1)
-
稳定性:❌ 不稳定(交换可能破坏顺序)
适用场景
-
仅适用于交换次数极少的情况。