桶排序(简化版)
最简单的排序
在我们生活的世界中很多事务都是被排序过的。成绩会排名,网购会分热度排序,邮件按照时间来排序,生活很多东东都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。
期末考试完了老师要将同学们的分数按照从高到低排序。小哼的班上只有5个同学,这5个同学分别考了5分、3 分、5分、2分和8分,哎,考得真是惨不忍睹(满分是10分)。
接下来将分数进行从大到小排序,排序后是85532。你有没有什么好方法编写一段程序,让计算机随机读入5个数
然后将这5个数从大到小输出?
思路:
定义好一个数组变量a[11]、两个个循环变量 i j 、 计数变量 t
数组初始化为0
循环接收输入数据 并把对应的桶的计数加一
两层for循环
第一层循环 依次判断a[10] ~a[0] 从大到小输出
第二层循环 循环次数 等于 出现的次数
就打印几次
代码如下:
#include<stdio.h>
int main()
{
int a[11],i,j,t;
for(i=0;i<=10;i++)
a[i]=0; //初始化为0
for(i=1;i<=5;i++) //循环读入5个数
{
scanf("%d",&t); //把每一个数读到变量t中
a[t]++; //进行计数
}
for(i=10;i>=0;i--) //依次判断a[10]~a[0]
for(j=1;j<=a[i];j++) //出现了几次就打印几次
printf("%d",i);
getchar();getchar(); //这里的getchar();用来暂停程序,以便查看程序输出的内容
//也可以用system("pause");等来代替
return 0;
}
这个排序算法就好比有11个桶,每出现一个数,就在对应的桶里放一个小旗帜,最后算一下桶里面有几个小旗帜就可以了。
接下来,计算一下这个排序算法—桶排序的时间复杂度,代码第5行循环了m次,代码第7行循环了n次,代码第12行循环了m次,代码第13行循环了n次,所以整个排序循环了m+n+m+n次,时间复杂度:O(m+n+m+n)即O(2*(m+n)),忽略常量,最终桶排序的时间复杂度为:O(m+n),通常用大写表示即:O(M+N)。
这是简化后易于理解的桶排序,是一个非常快的排序算法,其实这不是真正的桶排序(那会比这个复杂的多),简单易懂的入门排序这是一个非常好的起点。