冒泡排序(通俗易懂+例子)
冒泡排序很好理解,简单来说,就是每次选定第一个数,然后和后一个数进行比较
①选择a[0],如果比a[1]大,则进行交换,否则a[1]和a[2]进行比较,以此类推
②一共比较数字总数-1次
下面为详细过程
初始 | 2 | 1 | 3 | 5 | 3 | 2 | 6 | 8 | 4 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
第一次 | 1 | 2 | 3 | 3 | 2 | 5 | 6 | 4 | 0 | 8 |
第二次 | 1 | 2 | 3 | 2 | 3 | 5 | 4 | 0 | 6 | 8 |
第三次 | 1 | 2 | 2 | 3 | 3 | 4 | 0 | 5 | 6 | 8 |
第四次 | 1 | 2 | 2 | 3 | 3 | 0 | 4 | 5 | 6 | 8 |
第五次 | 1 | 2 | 2 | 3 | 0 | 3 | 4 | 5 | 6 | 8 |
第六次 | 1 | 2 | 2 | 0 | 3 | 3 | 4 | 5 | 6 | 8 |
第七次 | 1 | 2 | 0 | 2 | 3 | 3 | 4 | 5 | 6 | 8 |
第八次 | 1 | 0 | 2 | 2 | 3 | 3 | 4 | 5 | 6 | 8 |
第九次 | 0 | 1 | 2 | 2 | 3 | 3 | 4 | 5 | 6 | 8 |
代码
//冒泡排序
int main()
{
int tmp;
int a[10]={2,1,3,5,3,2,6,8,4,0};
for(int i=0;i<9;i++)
{
for(int j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
冒泡排序特征:
①时间复杂度
最好 | 平均 | 最坏 | 空间复杂度 |
---|---|---|---|
O(n) | O(n^2) | O(n^2) | O(1) |
当原始序列“正序”排列时,冒泡排序总的比较次数为n-1,移动次数为0,也就是说冒泡排序在最好情况下的时间复杂度为O(n);
当原始序列“逆序”排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为3n(n-1)/2次,所以冒泡排序在最坏情况下的时间复杂度为O(n^2);
当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n^2)。
冒泡排序排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)。