c++算法学习第一天:最快最简单的排序

哈哈!提到这个标题,你第一个想到的会是神马呢?“最快最简单的排序?”是……冒泡排序?快速排序?还是……?请在这里写下你的答案吧!

(请翻到最底下的投票!)

答案就是——

咳咳咳,言归正传

排序是一个在我们这个世界中无处不在的东东,有时候会按照身高排序,考试时我们的名次需要按照分数排序,网上购物的时候需要按照价格排序……

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 流星喵 星星喵。可是我们现在学的桶排序并没有讲的那么细啊!!?这该怎么办呢?不要着急,请看下集——冒泡排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值