排序算法(C++)
1 | 前言:要想成功,就别嫌自己笨 |
- 主体学习框架参考 图解
- 排序知识框架(待完善)
- 排序相关复杂度
算法名称 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | $O(n^2)$ |
$O(n)$ |
$O(n^2)$ |
$O(n1)$ |
稳定 |
选择排序 | $O(n^2)$ |
$O(n^2)$ |
$O(n^2)$ |
$O(n1)$ |
不稳定 |
插入排序 | $O(n^2)$ |
$O(n)$ |
$O(n^2)$ |
$O(n1)$ |
稳定 |
希尔排序 | $O(n^2)$ |
$O(n)$ |
$O(n^2)$ |
$O(n1)$ |
不稳定 |
归并排序 | $O(nlog2^n)$ |
$O(nlog2^n)$ |
$O(nlog2^n)$ |
$O(n)$ |
稳定 |
快速排序 | $O(nlog2^n)$ |
$O(nlog2^n)$ |
$O(n^2)$ |
$O(nlog2^n)$ |
稳定 |
堆排序 | $O(n^2)$ |
$O(n)$ |
$O(n^2)$ |
$O(n1)$ |
稳定 |
冒泡排序
1. 思想:
一遍历一边把顺序错误的元素交换,等于一直找比自己大或者小的元素,一路放到最后,时间复杂度是$O(n^2)$
2. 实现
1 | void bubbleSort(int* list){ |
选择排序
1. 思想:
2. 实现:
1 | void selectionSort(int *list){ |
插入排序
思想:
左边是一个有序的序列,每次有下标i去寻找在左边序列的位置。
平均时间复杂度是:$O(n^2)$
最坏时间复杂度是:$O(n^2)$
最好时间复杂度是:$O(n)$
空间复杂度是:$O(1)$
实现:
1 | //起始端维持一个有序的序列 |
希尔排序
思想:
实现
1 | void hillSort(int* list, int length){ |
归并排序
思想:
分治法,每个相邻的两个区间的值有序,则整个序列有序,区间用二分法,每次除以2
平均时间复杂度是:$O(n^2)$
最坏时间复杂度是:$O(n^2)$
最好时间复杂度是:$O(n)$
空间复杂度是:$O(1)$
实现
1 | //并归排序 |
快速排序
思想:
分治法,每次取一个基准,一般是首位,小于基准的放左边,大于基准的放右边
平均时间复杂度是:$O(n^2)$
最坏时间复杂度是:$O(n^2)$
最好时间复杂度是:$O(n)$
空间复杂度是:$O(1)$
实现
1 | //快速排序 |
堆排序
思想:
利用大顶堆的原理,每次把最大的堆顶取出来,与堆的最后一个元素交换,再继续做大顶堆直至结束
平均时间复杂度是:$O(n^2)$
最坏时间复杂度是:$O(n^2)$
最好时间复杂度是:$O(n)$
空间复杂度是:$O(1)$
实现
1 | //堆排序 |
计数排序
思想:
获得最大值,用最大值去构建一个数组,遍历列表一次,把命中下标的值加一,后面在遍历该数组,val有多少个,就拼多少个key给他
平均时间复杂度是:$O(n^2)$
最坏时间复杂度是:$O(n^2)$
最好时间复杂度是:$O(n)$
空间复杂度是:$O(1)$
实现
1 | //计数排序 |
非比较类排序讲原理,不写实现了
桶排序
思想:
原理正文
平均时间复杂度是:
最坏时间复杂度是:
最好时间复杂度是:
空间复杂度是::
基数排序
思想:
原理正文
平均时间复杂度是:
最坏时间复杂度是:
最好时间复杂度是:
空间复杂度是: