桶排序
Q:
小哼班上五个同学分别考了5分、3分、5分、2分和8分(满分为10分),随机读入,从大到小输出。
A:
因为满分为10分,所以
申请一个大小为11的数组 int a[11],从a[0]~a[10]都为零,表示还没有人得过,处理分数时,第一个人的分数是5,就将a[5]的数值加一,以此类推。然后将计入的数据打印,数值为几就打印几次。
Code:
#include <stdio.h>
void main()
{
int a[11],i,j,t;
for(i=0;i<=10;i++)
{
a[i]=0;//初始化为0
}
for(i=0;i<=5;i++)//循环读入5个数
{
scanf("%d",&t);//把每一个数读到变量t中
a[t++];//进行计数
}
for(i=0;i<=10;i++)//依次判断a[0]~a[10]
{
for(j=1;j<=a[i];j++)//出现了几次就打印几次
{
printf("%d",i);
}
}
}
时间复杂度:
设m为桶的个数,n为待排序数的个数,整个排序算法一共执行了m+n+m+n次,即O(2*(m+n)),忽略常数,以及用大写字母表示为:O(M+N),速度快,但是浪费空间!而且,分数无法对应上人。解决法——下一节,冒泡排序。