名称 | 性能分析 | 特点 | 稳定性 |
---|---|---|---|
直接插入 | 时间:- 最好:O(n),- 最差:O(n^2);空间:O(1) | 适合元素基本有序的场景 | 稳定 |
折半插入 | 时间:- 最好:O(nlogn),- 最差:O(n^2);空间:O(1) | 适合元素较多的场景 | 稳定 |
希尔排序 | 时间:- 最好:O(n^1.5),- 最差:O(n^2);空间:O(1) | 不稳定 | |
冒泡排序 | 时间:- 最好:O(n),- 最差:O(n^2);空间:O(1) | 适合元素基本有序的场景 | 稳定 |
快速排序 | 时间:- 最好:O(nlogn), - 最差:O(n^2);空间:O(logn) | 序列越无序,效率越高;反之,效率越低 | 不稳定 |
选择排序 | 时间:O(n^2);空间:O(1) | 不稳定 | |
堆排序 | 时间:O(nlogn);空间:O(1) | 适合元素较多的场景 | 不稳定 |
归并排序 | 时间:O(nlogn);空间:O(n) | 稳定 |
1.插入类排序
1.1 直接插入排序
算法思想:
- 逐个扫描,从后向前依次进行比较,
- 插入合适位置
1 | void inserSort(int *arr, int arrSize) |
1.2 折半插入排序
算法思想:
- 引入上下标,非遍历,
- 每次访问上下标中间的数,进行前后比较,插入
1 | void binaryInsertSort(int *arr, int arrSize) |
1.3 希尔排序
算法思路:
- 以固定增量将待排序列分成n组
- 进行组内排序;
- 选取更小的增量重复进行,直到增量为1
1 | void shellSort(int *arr, int arrSize) |
2.交换类排序
2.1 冒泡排序
算法思路:
- 将待排序列中的两个相邻元素进行比较,
- 每次都将较大(小)元素置前,以完成降(升)序排序
1 | void bubbleSort(int *arr, int arrSize) |
2.2 快速排序
算法思想:
- 引入头尾指针,以第一个元素为“轴”;
- 尾指针向前扫描,遇到比轴小的数时,放在头指针处;
- 变换扫描方向,头指针向后扫描,遇到比轴大的数时,放在尾指针处;
- 重复此过程,直到头尾指针相遇,即完成一次排序;
- 递归对轴的左右两部分分别进行此过程即可
1 | void quickSortHelper(int *arr, int low, int high) |
3.选择类排序
3.1 简单选择排序
算法思想:
- 找出无序序列中的最小关键字;
- 与第一个关键字进行位置交换;
- 循环此过程以遍历整个序列
1 | void selectSort(int *arr, int arrSize) |
3.2 堆排序
算法思想:
- 建堆;
- 大根堆:升序排序
- 小根堆:降序排序
- 删除根节点;
- 重建堆
1 | void heapify(int *arr, int i, int len) |
4. 归并排序
算法思想:
- 将待排序列看作一元组;
- 两两归并,排序为二元组;
- 以此类推,直至全部有序
1 | void merge(int *arr, int low, int mid, int high, int *help) |