排序

插入排序
- 直接插入排序
- 折半插入排序
- 链表插入排序
- 希尔排序
直接插入排序
插入第个对象时,前面的个已经排好序,按顺序从前到后比较,找到插入位置插入,原来位置上的对象向后顺移
1 | template <class Type> void dataList <Type> :: InsertSort ( ) { |
时间复杂度:
有稳定性
折半插入排序
在插入时用折半搜索寻找插入位置
1 | template <class Type> void dataList<Type> :: BineryInsSort ( ) { |
- 比直接插入排序快
- 比较次数与初始序列无关,仅依赖于对象个数
- 有稳定性
链表插入排序
数据存储在链表中
希尔排序(Shell Sort)
先分成若干组,在每一个组内用直接排序,然后再对整个序列进行直接插入排序
采用间隔分组方法分组
1 | template <class Type> void dataList<Type> :: ShellSort ( ) { |
- 不稳定
- 最坏情况:
交换排序
两两比较,如果逆序则交换
冒泡排序
- 有稳定性
快速排序
任取序列中的某个对象,作为基准,左侧放小的,右侧放大的,对两个子序列重复施行
1 | template <class Type> int dataList<Type> :: Partition (const int low, const int high){ |
- 平均情况:
- 空间复杂度:
- 不稳定
选择排序
- 直接选择
- 锦标赛
- 堆排序
直接选择排序
在一组对象中选择最小的对象
若它不是第一个,则与第一个交换
从这组对象中剔除这个最小的对象,在剩下的中重复执行上述步骤
不稳定
锦标赛
两两比较,选优胜者,循环往复,得到最小的对象,同时记录比较过程
每个节点DataNode:
data | index | active1
2
3
4
5
6template <class Type> class DataNode{
public:
Type data; //数据
int index; //节点在满二叉树的顺序号
int active; //参选标志:1参选、0不参选
}时间复杂度:
空间复杂度:
- 至少:
- 最多:
稳定
堆排序
最大堆
堆顶和最后一个交换
对前个对象,filterDown
重复执行
时间复杂度:
空间复杂度:
不稳定
归并排序
- 两个或两个以上的有序表合并成一个新的有序表
两路归并
- n个对象,两两归并,得到个长度为2的归并项
- 两两归并,重复得到有序
- 时间复杂度:
- 空间复杂度:
- 稳定
基数排序
- Title: 排序
- Author: SyEic_L
- Created at : 2026-03-12 17:42:25
- Updated at : 2026-04-11 10:54:48
- Link: https://blog.syeicl.vip/2026/03/12/排序/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments