zoukankan      html  css  js  c++  java
  • 桶排序

    小哼的班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎考的真是惨不忍睹(满分是10分)。接下来将分数进行从大到小排序,排序后是8 5 5 3 2。

    首先我们需要申请一个大小为11的数组int a[11]。OK现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数还都没有人得过。例如a[0]等于0就表示目前还没有人得过0分,同理a[1]等于0就表示目前还没有人得过1分……a[10]等于0就表示目前还没有人得过10分。

    113320lz09fp0o7ff7h8xf.png
    下面开始处理每一个人的分数,第一个人的分数是5分,我们就将相对应a[5]的值在原来的基础增加1,即将a[5]的值从0改为1,表示5分出现过了一次。

    113321w4iew2smzki8kmec.png

      第二个人的分数是3分,我们就把相对应a[3]的值在原来的基础上增加1,即将a[3]的值从0改为1,表示3分出现过了一次。

    113321rmecknx06n92ppu7.png

      注意啦!第三个人的分数也是“5分”,所以a[5]的值需要在此基础上再增加1,即将a[5]的值从1改为2。表示5分出现过了两次。

    113321a4euiehmeehcgpeb.png

      按照刚才的方法处理第四个和第五个人的分数。最终结果就是下面这个图啦。

    113321k7vs6474q39bo517.png

     
      你发现没有,a[0]~a[10]中的数值其实就是0分到10分每个分数出现的次数。接下来,我们只需要将出现过的分数打印出来就可以了,出现几次就打印几次,具体如下。
      a[0]为0,表示“0”没有出现过,不打印。
      a[1]为0,表示“1”没有出现过,不打印。
      a[2]为1,表示“2”出现过1次,打印2。
      a[3]为1,表示“3”出现过1次,打印3。
      a[4]为0,表示“4”没有出现过,不打印。
      a[5]为2,表示“5”出现过2次,打印5 5。
      a[6]为0,表示“6”没有出现过,不打印。
      a[7]为0,表示“7”没有出现过,不打印。
      a[8]为1,表示“8”出现过1次,打印8。
      a[9]为0,表示“9”没有出现过,不打印。
      a[10]为0,表示“10”没有出现过,不打印。

    最终屏幕输出“2 3 5 5 8”,完整的代码如下。

    01 #include <stdio.h>
    02 int main()
    03 {
    04     int a[11],i,j,t;
    05     for(i=0;i<=10;i++)
    06         a[i]=0;  //初始化为0
    07  
    08     for(i=1;i<=5;i++)  //循环读入5个数
    09     {
    10         scanf("%d",&t);  //把每一个数读到变量t中
    11         a[t]++;  //进行计数
    12     }
    13     for(i=0;i<=10;i++)  //依次判断a[0]~a[10]
    14         for(j=1;j<=a[i];j++)  //出现了几次就打印几次
    15             printf("%d ",i);
    16     getchar();getchar();
    17     //这里的getchar();用来暂停程序,以便查看程序输出的内容
    18     //也可以用system("pause");等来代替
    19     return 0;
    20 }

    输入数据为

    1 5 3 5 2 8

    桶排序在海量数据中的应用 

    一年的全国高考考生人数为500 万,分数使用标准分,最低100 ,最高900 ,没有小数,你把这500 万元素的数组排个序。

    分析:对500W数据排序,如果基于比较的先进排序,平均比较次数为O(5000000*log5000000)≈1.112亿。但是我们发现,这些数据都有特殊的条件:  100=<score<=900。那么我们就可以考虑桶排序这样一个“投机取巧”的办法、让其在毫秒级别就完成500万排序。

    方法:创建801(900-100)个桶。将每个考生的分数丢进f(score)=score-100的桶中。这个过程从头到尾遍历一遍数据只需要500W次。然后根据桶号大小依次将桶中数值输出,即可以得到一个有序的序列。而且可以很容易的得到100分有***人,501分有***人。 

    实际上,桶排序对数据的条件有特殊要求,如果上面的分数不是从100-900,而是从0-2亿,那么分配2亿个桶显然是不可能的。所以桶排序有其局限性,适合元素值集合并不大的情况。

  • 相关阅读:
    基础练习 数列排序
    入门训练 Fibonacci数列
    入门训练 圆的面积
    入门训练 序列求和
    fzu 2111 Min Number
    入门训练 A+B问题
    历届试题 城市建设
    sort 树 hash 排序
    nyist 676 小明的求助
    快速幂 蒙格马利算法
  • 原文地址:https://www.cnblogs.com/muziyun1992/p/6731959.html
Copyright © 2011-2022 走看看