C语言-桶排序

c/c++

浏览数:81

2019-3-30

前面扯皮

顾名思义,桶排序肯定是和相关的,可以是木桶,也可以是铁桶,也可以是其他的扯鸡巴的桶,所以统称为桶排序

什么是桶排序?

排序需要的铁桶

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的子里。 每个子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。

举例子说明

有一个人民教师,名字叫做阿布,这个阿布老师教的是体育课,期末考试了,阿布老师给全班50个人进行了跳远项目,跳高项目,100米跑步项目,每个项目都进行了打分,然后每个人的成绩都分别用一个成绩单记录,考试结束后,阿布老师在回办公室里的路上遇到教学主任,然后遇到了下面的对话。

阿布:主任好啊。

教学主任:阿布老师,你们班的考试成绩出来了吗?

阿布:出来了,出来了

教学主任:赶紧排下名词,今年的期末成绩排名就差体育了。

阿布:好好好~~~

阿布老师脑子不好,虽然打篮球很厉害,但是对排序这种的,怎么办啊?

阿布坐在教室里,突然看到教室后面有100个垃圾桶,以前校运会买来给学生当凳子坐的,阿布把100个垃圾桶依次排开,然后给100个垃圾桶都写上了编号1~100,阿布老师为自己的智商如此高超非常兴奋,先是自嗨的唱了一首歌,然后开始干活了,第一个学生的成绩是53,他把这个学生的成绩单放到53号桶,第二个学生的成绩是64,他把这个学生的成绩单放到64号桶,第三个学生的成绩又是53,他又把这个学生的成绩单放到53号桶~~~~~~(过了半个小时),阿布终于把所有学生的成绩扔到垃圾桶里了。然后阿布长笑一声,哈哈哈,终于完成了排序。

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define random_set(a,b) ((rand()%(b-a))+a)//获取a~b范围内的随机数

int main(void)
{
    int array_stu[50];//用来保存每个同学的分数
    int array_out[100];//用来保存排序后的数据
    
    srand((int)time(NULL));//设置随机数的基准,这样保证每次的运行结果不同
    
    /*先初始化两个数组*/
    memset(array_stu, 0, sizeof(array_stu));
    memset(array_out, 0, sizeof(array_out));

    /*用程序随机数给50个学生打分*/
    for(int i=0;i<50;i++)
    {
        array_stu[i] = random_set(1,99);
    }

    /*把50个学生的分数分别扔到对应的桶里面去*/
    for(int i=0;i<50;i++)
    {
        for(int j=1;j<100;j++)
        {
            /*如果分数跟桶的编号一样,就把这个桶的数据增加*/
            if(array_stu[i] ==j)
            {
                array_out[j] ++;
            }
        }
    }
    
    /*把排序后的数据输出*/
    for(int i=0;i<100;i++)
    {
        /*有些同学的分数是一样的*/
        while(array_out[i] > 0)
        {
            printf("%d\n",i);
            array_out[i]--;
        }
    }

    return (0);
}

程序输出

3
9
9
9
12
12
14
18
19
20
23
26
28
32
33
36
37
38
41
42
42
48
48
49
53
55
56
59
62
63
69
69
70
72
73
76
76
78
84
84
84
84
85
88
89
90
91
91
93
95

时间复杂度

具体看之前的文章

嵌入式Linux:老王带你理解算法复杂度O(1),O(N),O(N^2)​ zhuanlan.zhihu.com