桶排序[最快最简单排序O(M+N)]

来源:互联网 发布:如何淘宝开店认证 编辑:程序博客网 时间:2024/06/05 03:16

5个数要排序,5,3,5,2,8

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


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

#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); //把每一个数读到变量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; }

实现的是从小到大排序。但是我们要求是从大到小排序,只需要将for(i=0;i<=10;i++)改为for(i=10;i>=0;i--),就OK啦


时间复杂度:

      代码中第5行的循环一共循环了m次(m为桶的个数),第7行的代码循环了n次(n为待排序数的个数),第12行和第13行一共循环了m+n次。所以整个排序算法一共执行了m+n+m+n次。我们用大写字母O来表示时间复杂度,因此该算法的时间复杂度是O(m+n+m+n)即O(2*(m+n))。我们在说时间复杂度的时候可以忽略较小的常数,最终桶排序的时间复杂度为O(m+n)。还有一点,在表示时间复杂度的时候,n和m通常用大写字母即O(M+N)


这是一个非常快的排序算法。


缺点

       非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请2100000001个变量,也就是说要写成int a[2100000001]。因为我们需要用2100000001个“桶”来存储0~2100000000之间每一个数出现的次数。即便只给你5个数进行排序(例如这5个数是1、1912345678、2100000000、18000000和912345678),你也仍然需要2100000001个“桶”,这真是太浪费空间了!还有,如果现在需要排序的不再是整数而是一些小数,比如将5.56789、2.12、1.1、3.123、4.1234这五个数进行从小到大排序又该怎么办呢?桶排序解决不了小数排序

0 0
原创粉丝点击