排序算法分类
类型 | 排序名称 | 排序名称 |
---|---|---|
插入排序类型 | 直接插入排序 | 希尔排序 |
选择排序类型 | 选择排序 | 堆排序 |
交换排序类型 | 冒泡排序 | 快速排序 |
归并排序类型 | 归并排序 |
性能—时间复杂度&空间复杂度
下一篇博客中将10, 1000, 10000个数据用什么排序算法比较合理
排序方法 | 平均时间复杂度 | 最好情况 | 最差情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(n^ 1.3)~O(n^2) | O(n) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | o(nlogn) | O(n) | 稳定 |
插入排序
思路
将前i个排好顺序的情况下,添加第i+1个数,再将前i+1个数排好顺序。直到排到i == n。
代码实现
void InsertSort(vector<int>& v, int len)
{
for (int i = 0; i < len; i++)
{
for (int j = i; j > 0; j--)
{
if (v[j] < v[j - 1])
swap(v[j], v[j - 1]);
}
}
}
特点:元素越接近有序,直接插入排序的算法时间效率越高
冒泡排序
思路
进行第i趟排序时,从0位置开始,选中相邻的两个元素,如果该两个元素不满足顺序要求,则将这两个元素的进行交换,标记后者元素位置,直到标记到n-1位置,一趟排序完成。
代码实现
void BubbleSort(vector<int>& v, int len)
{
for (int i = 0; i < len; i++)
{
for (int j = 1; j < len - i; j++)
{
if (v[j] < v[j - 1])
swap(v[j], v[j - 1]);
}
}
}
特点:适合数据不多的情况下,进行排序
选择排序
思路
第i趟设置一个标记位,标志最小值&最大值,将一趟标记最小值的位置放在一端,标记最大值的位置放在另一端,完成一趟排序。(最大值标记可以省去)
代码实现
void SelectSort(vector<int>