搜索
楼主: 啊哈磊
打印 上一主题 下一主题

【啊哈!算法】算法1:最快最简单的排序——桶排序

[复制链接]
10#
发表于 2014-2-23 23:19:23 | 只看该作者
本帖最后由 超神级 于 2014-2-24 07:36 编辑
  1. 话说你们真不地道...
  2. 修正:
  3. #include <stdio.h>
  4. int main()
  5. {
  6.     int a[11],i,j,t;
  7.     for(i=0;i<=10;i++)
  8.         {
  9.         a[i]=0;  //初始化为0
  10.     }
  11.     for(i=1;i<=5;i++)  //循环读入5个数
  12.     {
  13.         scanf("%d",&t);  //把每一个数读到变量t中
  14.        a[t]++;  //进行计数
  15.     }

  16.     for(i=0;i<=10;i++)  //依次判断a[0]~a[10]
  17.         for(j=1;j<=a[i];j++)  //出现了几次就打印几次
  18.             printf("%d ",i);

  19.     getchar();getchar();
  20.     //这里的getchar();用来暂停程序,以便查看程序输出的内容
  21.     //也可以用system("pause");等来代替
  22.     return 0;
  23. }
  24. 输入数据为
  25. 23558
复制代码

点评

已修改!  发表于 2014-2-24 00:48
9#
 楼主| 发表于 2014-2-23 22:31:27 | 只看该作者

比如说huhu 5分、haha 3分、xixi 5分、hengheng 2分和gaoshou 8分
最后可以输出 8分 5分 5分 3分 2分,其实最后只留下这些分数是没有用的。已经失去了排序的意义了,我们其实关心的是人的排序。而不是分数的排序。我们希望得到的是  gaoshou  huhu xixi haha hengheng。
8#
发表于 2014-2-23 19:42:47 | 只看该作者
啊哈磊 发表于 2014-2-23 18:51
其实这里也没对分数进行真正的排序,因为输出的其实是序号

序号说的是?
7#
 楼主| 发表于 2014-2-23 18:51:53 | 只看该作者
rosynirvana 发表于 2014-2-23 18:28
这里概念错误了
事实上这里就是对分数进行排序,而不是对“人本身”进行排序
包含不包含名字对 算法  ...

其实这里也没对分数进行真正的排序,因为输出的其实是序号
6#
发表于 2014-2-23 18:28:37 | 只看该作者
需要说明一点的是:我们目前学习的简化版桶排序算法其本质上还不能算是一个真正意义上的排序算法。为什么呢?例如遇到下面这个例子就没辙了。

  现在分别有5个人的名字和分数:huhu 5分、haha 3分、xixi 5分、hengheng 2分和gaoshou 8分。请按照分数从高到低,输出他们的名字。即应该输出gaoshou、huhu、xixi、haha、hengheng。发现问题了没有?如果使用我们刚才简化版的桶排序算法仅仅是把分数进行了排序。最终输出的也仅仅是分数,但没有对人本身进行排序。


这里概念错误了
事实上这里就是对分数进行排序,而不是对“人本身”进行排序
包含不包含名字对 算法 本身是没关系的
这里可以说是没有实现最初的要求,说“不是真正意义上的排序算法”就没必要了,建议删掉这些
5#
发表于 2014-2-23 17:26:16 | 只看该作者
磊哥终于可以出算法书了!赞一个!
地板
发表于 2014-2-23 14:44:59 | 只看该作者
顶顶顶
板凳
发表于 2014-2-23 13:55:45 | 只看该作者
高级篇就要出炉啦,必须点32个赞~~~
沙发
发表于 2014-2-23 12:42:34 | 只看该作者
本帖最后由 超神级 于 2014-2-24 07:39 编辑

不错回头再看!...
//修正:把程序一些错误修改。磊哥太大意了!程序没自己测试下...
//为了体谅些新人把不易理解的地方添加了一些注释。
#include <stdio.h>
int main()
{
    int a[11],i,j,t;
    for(i=0;i<=10;i++)
        {
        a=0;  //初始化为0
    }
    for(i=1;i<=5;i++)  //循环读入5个数
    {
        scanf("%d",&t);  //把每一个数读到变量t中
       a[t]++;  //进行计数,
                //用户输入的值是数组下标如果你输入1吧a[1]里面的值依然是0,
    }           //a[1]++;就是把吧a[1]里面的值加1,用一句话把这代码用处概况就是
                //把当前数组里面储存的值加1;

    for(i=0;i<=10;i++)  //依次判断a[0]~a[10]。;
        for(j=1;j<=a;j++)  //出现了几次就打印几次
            printf("%d ",i);//先把此处再次理解a[t]++;
            //详细分析下:为什么能实现排序呢。
                        //为什么需要11个数组呢!因为他只可以对10一下排序再大了就没对应的数组下标了!
           //重点来了!把数组从大到小遍历for(i=0;i<=10;i++)
           //for(j=1;j<=a;j++)  因为a的值是跟据输入的(参考a[t]++;)可能是1可能是2
           //这句话是判断里面的a的值是几!把当前数组下标i输出几次!

    getchar();getchar();
    //这里的getchar();用来暂停程序,以便查看程序输出的内容
    //也可以用system("pause");等来代替
    return 0;
}
//输入数据为
//23558


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表