C语言冒泡排序算法
1、原理与思路
每次将相邻的两个数进行比较,如果它们的顺序不对就交换,每比较一趟只能将一个数归位。
例如:将 9 10 2 11 12 降序(从大到小)排序
2、实现代码
#include<stdio.h>
int main()
{
int n,a[100],temp;
scanf("%d",&n); // 输入n,表示共有n个数进行排序
for(int i=1;i<=n;i++) // 将n个数读入到数组a中
scanf("%d",&a[i]);
// 冒泡排序核心部分
for(int i=1;i<=n-1;i++) // n个数排序,只需进行n-1趟
{
for(int j=1;j<=n-i;j++) // 已经归位的数无需再比较
{
if(a[j]<a[j+1]) // 这里是降序,升序改为 >
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
示例:
3、补充
冒泡排序的核心部分是双重嵌套循环,其时间复杂度是O(
N
2
N^2
N2)。
现有一些人的名字和分数,请按照分数从高到低,输出他们的名字。
#include<stdio.h>
struct student // 创建一个结构体用来存储名字和分数
{
char name[25];
int score;
};
int main()
{
struct student a[100],temp;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) // 读入n个人的名字和分数
scanf("%s %d",&a[i].name,&a[i].score);
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=n-i;j++)
{
if(a[j].score<a[j+1].score) // 对分数进行比较,这里是按分数从高到低,升序改为 >
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=1;i<=n;i++)
printf("%s ",a[i].name); // 输出名字
return 0;
}
示例: