一.冒泡排序的基本思想
冒泡排序是我学习的第一个排序,他的基本思想很简单,就是按照顺序两个数字比大小如果前者大(小),就交换两个数字的位置,想冒泡一样
一共分两层循环一个内层循环一个外层循环,内层循环负责换数字位置,外层循环负责内层循环的次数。
二.冒泡排序的优化
冒泡排序的优化一共有两种一种是针对内层循环的优化另外是针对外层循环的优化。
外层循环的优化:先设置一个标记如果标记没有执行到内层循环(完全不用交换)则直接跳出冒泡排序
内层循环的优化:针对如果一个数组之前有一小部分数据有顺序(从开头有序)就直接转到有序的最后一个位置
如上图所示这样就完成了两种优化。
三.时间复杂度
最好结果(有序为最好):O(n)复杂度只用遍历一遍数组即可退出
最坏结果(完全倒序)O(n^2)
平均时间复杂度:O(n^2)
四.代码实现
void BubbleSort1(int *arr,int length)//冒泡排序基础的代码
{
int i,j;
for(i=0;i<length-1;i++)
{
for(j=0;j<length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
arr[j]=arr[j]^arr[j+1];
arr[j+1]=arr[j]^arr[j+1];
arr[j]=arr[j]^arr[j+1];
}
}
}
}
void BubbleSort2(int *arr,int length)//外层优化
{
int i,j;
int flag=0;
for(i=0;i<length-1;i++)
{
flag=0;//优化外层循环
for(j=0;j<length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
//交换两数字位置
arr[j]=arr[j]^arr[j+1];
arr[j+1]=arr[j]^arr[j+1];
arr[j]=arr[j]^arr[j+1];
flag++;
}
}
if(flag==0)
{
printf("--------------\n");
break;
}
}
}
void BubbleSort3(int *arr,int length)//加上内层优化
{
int i,j;
int flag=0;
for(i=0;i<length-1;i++)
{
flag=0;//优化外层循环
for(j=0;j<length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
//交换两数字位置
arr[j]=arr[j]^arr[j+1];
arr[j+1]=arr[j]^arr[j+1];
arr[j]=arr[j]^arr[j+1];
flag=j+1;
}
}
if(flag==0)
{
printf("--------------\n");
break;
}
i=length-flag-1;
}
}
五.稳定性
冒泡排序是稳定的,可以理解为里面没有相等两数交换就稳定
有问题欢迎提问---------!