冒泡排序:
问题:给定一个无序数组,要求进行排序(从小到大)
思路:1.比较相邻两个元素,如果前一个大于后一个,通过swap函数进行交换,这样交换完最后一个元素将是这组数里最大的元素。
2.此后将最后一个元素排除在外,从数组0位置再次开始重复上述比较操作,排除最后一个。
3.依次执行,直到没有任何一对数字需要比较。
优化:如果此数组是一个有序数组,那么进行多次循环比较实则是浪费时间,最优时间复杂度会变高。所以添加一个bool类型变量flag,如果第一轮比较没有出现具有交换条件,那么直接结束所有循环。
主要代码如下(C++):
void bubbleSort(vector<int> &vec)
{
for(int j=vec.size()-1;j>0;j--);//循环控制最后一个元素
{
bool flag=true;//优化
for(int i=0;i<j;i++)//遍历数组
{
if(vec[i]>vec[i+1])//出现顺序不对
{
swap(vec[i],vec[i+1]);//交换位置
flag=false;
}
}
if(falg==true)//未出现位置不对
{
return;//直接返回结束
}
}
}
空间复杂度:O(1)
时间复杂度:
1.平均O(N^2)//两次for循环
2.最优O(N)//只遍历一次,优化了
3.最差O(N^2)//两次for循环
稳定性:稳定
原因:相等的两个元素,排序后,相对位置不会出现变化。