新手如何去理解桶排序

问题一:什么是桶排序。

 实际上在写这篇文章开始我去网络上搜索了一段关于桶排序的解释,大家要是想有更深的理解的话可以看一下这张图片解释,如果不愿意看直接跳过也没太大的关系。

        

        

         在了解桶排序之前大家或许都或多或少的了解过排序算法,就算没有了解过的同学也没关系,我保证看了这章后大家就能写出一段简单的桶排序算法。

        同学们可以想象一下你走在菜市场或者超市的蔬菜区的时候是不是基本上没见到过有哪个摊主将所有的蔬菜混合到一个桶(菜篮子,竹篮)中来售卖,而是把不同的蔬菜种类分开装在不同的篮子中,然后按数量或者价格升序或者降序排列好。

        假设我们有蔬菜“8”五个,蔬菜“3”四个,蔬菜“4”二个蔬菜的名称便是他们的价格,我们需要对每种蔬菜准备好适合的“桶”将着十一个蔬菜按价格降序排列好,那么应该怎么做呢?大家可以暂时想一下。

问题二:如何去设计桶

        实际上这是个很简单的问题,我们既然要保存大量数据基本上离不开数组,将每个数组的单位,假设存在整数数组arr[100],那么便有100个桶,桶arr[8]装蔬菜“8”,桶arr[3]装蔬菜“3”,桶arr[4]装蔬菜“4”。

        讲到这里大家是不是顿悟了?走到这一步很棒了,给自己点个赞,那么接下来我们直接来展示具体代码。

问题三:具体代码

        #include<stdio.h>
int main(void)
{
    int arr[100] = {0};
//初始化数组元素全部为0
    int num;//声明下标
    for (int i = 0; i < 11; i++)//要输入多少数字可以自己设计,因为我给的数据例子只有11个。
    {
        scanf("%d", &num);
        arr[num]++;
//读取到数据num,则arr[num]自身加1
    }
    for (int i = 99; i >= 0; i--)
//因为我们要求的是倒序,所以按数组的下标大小从后往前数(读取)
        for (int j = arr[i]; j > 0; j--)//我们发现 ‘i” 这个桶有arr[j]个蔬菜,拿出来一个arr[j]自身要减去
            printf("%d ",i);                                一个。
    
}

如下图,第一行为输入,第二行为输出。

这段代码方便之处在于不用进行手动排序,而是根据数组下标的特性。

问题四:可能存在的疑问

        可能有小伙伴想为什么要把数组里面的元素全部赋值为0呢,因为这100个桶一开始什么都没有放,每个桶里面的蔬菜个数都是0,如果不提前全部赋值为0,根据电脑编译器或操作系统的差别,数组里面的元素不一定是0,可能是个随机数或者其他情况。

           反应快的同学可能会想如果存在蔬菜“1000000”怎么办呢,这不是会浪费很多空间吗?

而且桶排序排列数字很方便,但是现实中怎么存在名字是数字的物品呢,而这就是我们下一节的内容了--------“冒泡排序”。

        

        

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值