码迷,mamicode.com
首页 > 编程语言 > 详细

桶排序[最快最简单排序]

时间:2015-01-27 16:25:11      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:桶排序   最快最简单   排序   

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这五个数进行从小到大排序又该怎么办呢?桶排序解决不了小数排序

桶排序[最快最简单排序]

标签:桶排序   最快最简单   排序   

原文地址:http://blog.csdn.net/wtyvhreal/article/details/43195389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!