【排序】1.1简单桶排序

来源:互联网 发布:小米5移动卡没有4g网络 编辑:程序博客网 时间:2024/05/22 07:03

简单的“桶排序”:书中介绍的桶排序是借助一维数组解决问题。将数组下标作为已经排序的序列,将值存入数组中对应的位置,达到排序的目的。

题目一:5个同学分别考了5分、3分、5分、2分、8分,满分为10分;让计算机随机读入这5个数,按照分数从大到小输出。

输出结果:8 5 5 3 2

解:

思路:1.初始化大小为11的数组a[0]-a[10];

   2.分数对于数组下标,存在则+1,代表出现的次数,比如,若5分,a[5]=1;

   3.顺序输出,数组中值表示输出次数。

实现(C):

#include<stdio.h>int main(){    int a[11],i,j,x;    for(i=0;i<=10;i++)    {        a[i]=0;    }    for(i=0;i<5;i++)    {        scanf("%d",&x);        a[x]++;    }    for(i=10;i>=0;i--)    {        for(j=1;j<=a[i];j++)        {            printf("%d",i);        }    }    getchar();getchar();    return 0;}


题目二:若对0-1000范围内的整数进行排序呢?

解:

思路:如上题,需要大小为1001的数组,1001个桶,来表示0-1000之间每个数出现的次数。

实现(C):

#include<stdio.h>int main(){    int a[1001],i,j,x,n;    for(i=0;i<=1000;i++)    {        a[i]=0;    }    scanf("%d",&n);    for(i=0;i<n;i++)    {        scanf("%d",&x);        a[x]++;    }    for(i=0;i<=1000;i++)    {        for(j=1;j<=a[i];j++)        {            printf("%d ",i);        }    }    return 0;}


时间复杂度(如题二):

第一个循环执行m次(m为桶的个数),第二个循环执行n次(n为待排序数的个数),第三、四个循环共执行m+n次,共2*(m+n)次;

表示为O(2*(m+n)),忽略掉较小的常数,时间复杂度表示为O(M+N)。


总结:简化版的桶排序,速度非常快,但有局限性。


原创粉丝点击