1.冒泡排序
算法描述:
冒泡排序是排序算法中比较简单的一种。
冒泡排序的主要思想是:通过n次遍历,每次遍历过程中遇到相邻的元素不符合排序顺序的,则交换位置,数组中的元素就像冒泡一样,一个一个冒上来。
排序过程如下图:
图片来源于visualgo:排序
算法实现:
C++代码实现:
void BUBsort(vector<int>& v)
{
for (int i = v.size();i > 0;i--)
{
for (int j = 0;j < i-1;j++)
{
if (v[j] > v[j + 1])
{
int temp = v[j];
v[j] = v[j + 1];
v[j + 1] = temp;
}
}
}
}
针对以上代码,我们有一下的时间和空间复杂度:
时间复杂度:
最优的时间复杂度为:O( n^2 ) ;
最差的时间复杂度为:O( n^2 );
平均的时间复杂度为:O( n^2 );
空间复杂度:
最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);
优化方案
如果我们在代码中加入一个标识位,记录数组在所有的n次遍历结束前是否已经刚好排序完成了,这样当数组刚好排序完成的时候,我们可以直接跳过剩下的遍历,优化最优的时间复杂度,代码如下
void BUBsort(vector<int>& v)
{
for (int i = v.size();i > 0;i--)
{
bool isSwap=false;
for (int j = 0;j < i-1;j++)
{
if (v[j] > v[j + 1])
{
int temp = v[j];
v[j] = v[j + 1];
v[j + 1] = temp;
isSwap=true;
}
}
if(!isSwap)
return;
}
}
当一次遍历过后数组中的元素没有交换,说明数组已经排序完成,直接结束遍历。
所以最优的时间复杂度为O(n),当数组一开始就是有序的时候,只需遍历1次即可。