哈哈!提到这个标题,你第一个想到的会是神马呢?“最快最简单的排序?”是……冒泡排序?快速排序?还是……?请在这里写下你的答案吧!
(请翻到最底下的投票!)
答案就是——
咳咳咳,言归正传
排序是一个在我们这个世界中无处不在的东东,有时候会按照身高排序,考试时我们的名次需要按照分数排序,网上购物的时候需要按照价格排序……
1.用分数来排序(题目)
题目要求
小曼的班上一共有5名可爱的童鞋,这5个同学分别考了5分,3分,5分,2分和8分(满分是10分)。接下来将分数从大到小排序,那么就是:8 5 5 3 2。你有没有什么好的方法编写一段代码来完成这个从小到大的排序呢?请先写一写,至少15分钟后过来看吧(●ˇ∀ˇ●)。
题目思路
ok!想好了吗?
我们这里只需要借助一个一维数组就可以解决这个问题啦!
首先我们需要申请一个大小为11的数组int a[11]。OK,现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数都还没有人得过。
下面开始处理每个人的分数,第一个人的分数是5分,我们就将相对应的a[5]的值在原来的基础上增加1,即将a[5]的值从0改为1,表示5分出现过了一次。
第二个人的分数是3分,我们就把相对应的a[3]的值在原来的基础上增加1,即将a[3]的值从0改为1,表示3分出现过一次。
以此类推下去,最后就变成了这样子(OS:做图真的好累啊┭┮﹏┭┮):
你发现没有,a[0]到a[10]的值其实就是0~10每个数字出现的次数,接下来,我们只要把0~10每个分数出现的次数打印出来就阔以啦 !
代码勿抄
#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);//把每一个数读到变量当中
a[t]++;//进行计数
}
for(i=0;i<=10;i++)//一次判断a[0]~a[10]
for(j=1;j<=a[i];j++)//出现了几次就打印几次
printf("%d",i);
return 0;
}
带入学习桶排序
桶排序也是分配排序的一种,但其是基于比较排序的,这也是与基数排序最大的区别所在。
思想:桶排序算法想法类似于散列表。首先要假设待排序的元素输入符合某种均匀分布,例如数据均匀分布在[ 0,1)区间上,则可将此区间划分为10个小区间,称为桶,对散布到同一个桶中的元素再排序。
要求:待排序数长度一致。
排序过程:
(1)设置一个定量的数组当作空桶子;
(2)寻访序列,并且把记录一个一个放到对应的桶子去;
(3)对每个不是空的桶子进行排序。
(4)从不是空的桶子里把项目再放回原来的序列中。
提要下文
现在分别有5个人的名字和分数:lyf 5分,流星喵 3分,PS 5分 ,星星喵 2分 ,jqy 8分。请按分数从高到低,输出他们的名字,及应该输出 jqy lyf PS 流星喵 星星喵。可是我们现在学的桶排序并没有讲的那么细啊!!?这该怎么办呢?不要着急,请看下集——冒泡排序。