排序算法分析之桶排序

  • 基本思想

桶排序的思想是,若待排序的记录的关键字在一个明显有限范围内时,可设计有限个有序桶,每个桶只能装与之对应的值,顺序输出各桶的值,将得到有序的序列。简单来说,在我们可以确定需要排列的数组的范围时,可以生成该数值范围内有限个桶去对应数组中的数,然后我们将扫描的数值放入匹配的桶里的行为,可以看作是分类,在分类完成后,我们需要依次按照桶的顺序输出桶内存放的数值,这样就完成了桶排序。

例如,要求我们输入 n 个 0~9 之间的整数,由小到大排序输出,我们可以准备 10 个桶依次编号为 0~9。那么,输入的数 0 则入 0 号桶,1 入 1 号桶,依次类推。

a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10]a[11]
692415371081
把b数组的值用来统计a数组中的值出现的次数         
a数组的值用来充当b数组的下标
b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]b[10]
2111111111

这个算法就好比有 11 个桶,编号从 0~10。每出现一个数,就将对应编号的桶中的放一个小旗子,最后只要数数每个桶中有几个小旗子就 OK 了、

现在你可以请尝试一下输入 n 个 0~10之间的整数,将他们从大到小排序。提醒一下如果需要对数据范围在 0~10 之间的整数进行排序,我们需要 11 个桶,来表示 0~10 之间每一个数出现的次数,这一点一定要注意。另外此处的每一个桶的作用其实就是“标记”每个数出现的次数,因此我喜欢将之前的数组 a 换个更贴切的名字 book(book 这个单词有记录、标记的意思),代码实现如下。


#include <bits/stdc++.h>
using namespace std;
    int main()
    {
        int book[11],t,n;
        for(int i=0;i<=10 ;i++)
            book[i]=0;
       cin>>n;//输入一个数n,表示接下来有n个数
        for(int i=1;i<=n;i++)//循环读入n个数,并进行桶排序
        {
            cin>>t;  //把每一个数读到变量t中
            book[t]++;  //进行计数,对编号为t的桶放一个小旗子
        }
        for(int i=10 ;i>=0;i--)  
        //依次判断编号10 ~0的桶,从大到小打印 
            for(int j=1;j<=book[i];j++)  //出现了几次就将桶的编号打印几次
                 cout<<i<<" ";
     
        return 0;
    }

 只需要将for(i=10;i>=0;i--)改为   for(i=0;i<=10;i++)  就是从小到大

时间复杂度是 o(n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值