冒泡排序是个很经典的排序算法
小李学嵌入式C语言关于对冒泡排序的思考,这里记录一下;
冒泡排序最关键的还是轮数和交换次数的关系,其实经过分析可以得出最少的排序次数,和轮数,当然不同的写法也可以实现,只是要么轮数会多跑一趟,要么是交换的次数会变多一些
这个图片是个动画版,老师给的我觉得对于理解交换还是很有帮助的,放上来大家一起欣赏这个图明显的是大的往后换是顺序排序;
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,6,5,4,7,8,10,9};//初始化数组乱序
int t;
for(int i=0;i<10-1;i++)//冒泡排序的轮数控制0-8最多9次(n-1)
{
for(int j=0;j<10-1-i;j++)//冒泡排序的交换次序控制最多9次(n-1),最少1次
{
if(a[j]>a[j+1])//如果前面比后面的大则进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
} //实现顺序排序
}
}
for(int i=0;i<10;i++)
printf("%d ",a[i]);//格式化输出
return 0;
}
运行结果如图
还有一种就是实现逆序排序
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,6,5,4,7,8,10,9};//初始化数组乱序
int t;
for(int i=0;i<10-1;i++)//冒泡排序的轮数控制0-8最多9次(n-1)
{
for(int j=0;j<10-1-i;j++)//冒泡排序的交换次序控制最多9次(n-1),最少1次
{
if(a[j]<a[j+1])//如果前面比后面的小则进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
} //实现逆序排序
}
}
for(int i=0;i<10;i++)
printf("%d ",a[i]);//格式化输出
return 0;
}
运行结果如图:
下面是一些思考
当我把轮数改大之后发现依然可以进行,但是为了形成一个比较科学的学习和记忆我还是决定记住冒泡排序的最优写法;i<n-1;i<n-1-j;
i和j都是从0开始变化,这样交换的时候才能保证每个都可以进行,i控制的是冒泡的轮数,而j控制的是每次排序的交换的次数,因为这个会随着轮数的变大而变小,因为随着轮数的进行顺序也在慢慢的变整齐,交换的次数和排序的轮数相加是恒等于n的;