趣学算法——1.2冒泡排序

冒泡排序

前一节的简易桶排序,有很大的局限性。

  • [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 )。这是
一个非常高的时间复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值