冒泡排序
前一节的简易桶排序,有很大的局限性。
-
[1] 只能排列数字:若数字有了含义,对应人名则无法按人名排列;
-
[2 ] 非常浪费空间:例如需要排序数的范围是很大。但要排序的数却很少;
-
[3 ] 小数无法排列:如果现在需要排序的不再是整数而是一些小数,比如将 5.56789、2.12、1.1、3.123、4.1234;
思路:每次比较相邻两个数的大小,如果它们的顺序错误就将它们交换过来。每趟都将一个数字归位,总共要走n-1趟。
#include <stdio.h>
int main()
{
int a[100],i,j,n,t;
scanf("%d",&n);//接受几个数
for (i=1;i<=n;i++)
scanf("%d",&a[i]);//读入数
for (i=1;i<=n-1;i++)//一共跑n-1趟
{
for (j=1;j<=n-i;j++)
if (a[j]<=a[j+1])//比较
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
for (i=1;i<=n;i++)
printf("%d ",a[i]);//输出数字
getchar();
return 0;
}
感悟:冒泡排序的核心部分是双重嵌套循环。
拓展练习:有姓名的数字排序
思路:创建了一个结构体用来存储姓名和分数
#include <stdio.h>
struct student
{
char name[21];
char score;
};//这里创建了一个结构体用来存储姓名和分数
int main()
{ struct student a[100],t;
int i,j,n;
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%s %d",a[i].name,&a[i].score);
for (i=1;i<=n-1;i++)
{
for (j=1;j<=n-i;j++)
{
if(a[j].score<=a[j+1].score)
{ t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
}
for (i=1;i<=n;i++)
printf("%s是%d\n",a[i].name,a[i].score);
getchar();getchar();
return 0;
}
感悟:冒泡排序的时间复杂度是 O(N 2 )。这是
一个非常高的时间复杂度。