一、概述
想整理排序算法好久了,终于被我逮到机会,来好好梳理一下,先来介绍一些比较简单的排序,本文就讲一下冒泡排序、选择排序、插入排序吧
二、思想解释
这里有一张十大排序的总结表 (图片来自菜鸟教程)
什么是稳定排序?
相同数字在排序之后的相对位置没有改变即为稳定排序。
1. 冒泡排序
冒泡排序是稳定排序,时间复杂度
O
(
N
2
)
O(N^2)
O(N2),空间复杂度
O
(
1
)
O(1)
O(1),每次遍历将剩下数据的最大值移到末尾,示意图如下所示,之后的每一轮依次类推,第二轮遍历到
a
[
3
]
=
4
a[3] = 4
a[3]=4结束。
2. 选择排序
选择排序不是稳定排序,时间复杂度
O
(
N
2
)
O(N^2)
O(N2),空间复杂度
O
(
1
)
O(1)
O(1),每次遍历,挨个比较当前数据与第i个数据的大小,若小于
a
[
i
]
a[i]
a[i],则交换值,第一轮示意图如下,第二轮则从
a
[
1
]
=
5
a[1] = 5
a[1]=5开始。
3. 插入排序
插入排序是稳定排序,时间复杂度
O
(
N
2
)
O(N^2)
O(N2),空间复杂度
O
(
1
)
O(1)
O(1),每次从后往前比较,如果小于前面的元素则交换,直到不小于为止。插入排序示意过程如下图所示。
三、代码实现
1. 冒泡排序
void bubbleSort(vector<int>& nums)
{
for(int i = 0; i < nums.size(); i++)
{
for(int j = 0; j < nums.size() - i - 1; j++)
{
if(nums[j] > nums[j + 1])
swap(nums[j], nums[j + 1]);
}
}
}
2. 选择排序
void selectionSort(vector<int>& nums)
{
for(int i = 0; i < nums.size(); i++)
{
for(int j = i + 1; j < nums.size(); j++)
{
if(nums[j] < nums[i])
swap(nums[i], nums[j]);
}
}
}
3. 插入排序
void insertionSort(vector<int>& nums)
{
for(int i = 1; i < nums.size(); i++)
{
int j = i;
while(j > 0 && nums[j] < nums[j - 1])
{
swap(nums[j], nums[j - 1]);
j--;
}
}
}