简单的排序算法——"桶排序"(简易版)

《啊哈!算法》笔记

桶排序顾名思义,像是用有顺序的桶子一样的东西来装东西排序。
  那么来举个例子:
  我现在有5个分数3,1,2,4,3(满分5分)这五个分数需要按从小到大来排个序12334,我们用桶排序该怎么排呢?


  代码如下:

#include<stdio.h>
int main()
 {
     int buc[6]={0};        //定义木桶并初始化,因为我们要在012345个分数中排序所以要定义6个桶。
     int i,j,t,n;           
     scanf("%d",&n);        //输入一个数n+1,表示接下来有n个数要排序
     for(i=1;i<n;i++)       //循环读入n个数,并进行排序
     {
         scanf("%d",&t);    //把每一个数读到变量t中;
         buc[t]++;          //进行计数;
     }
     for(i=0;i<=5;i++)      //判断0到5的桶
         for(j=1;j<=buc[i];j++)//出现了几次就将桶的编号打印几次;
            printf("%d",i);

}

在第七行中这个循环中将我们每一个分数放入了相对应的桶中。

在第十二行和十三行循环里我们将分数打印出来,就像题目一样31243,有两个3,在经过了第七行的buc[t]++,第一次给buc[3]++了一次,最后一次也是录入了一个3,所以buc[3]继续加1,所以buc[3]累加了两次。

就是把分数3放到了对应的三号桶里,最后看看三号桶里有几个分数3,在按照顺序循环输出。

时间复杂度的问题,第七行循环了M次,在十二和十三行中循环了M+N次,所以整个排序算法一共执行了M+N+M+N次。

我们用大写字母O表示时间复杂度,所以此算法的时间复杂度为O(2*(M+N),我们在说时间复杂度的时候可以忽略较小的常数,最终也就是O(M+N)。

再说说自己的理解,我认为在数组的项数和所要排序内容有相似之处时可以用这种排序法,利用数组固定的项数记录并依次排序输出,就没有那么复杂。

这种排序还不算是真正意义上的桶排序,真正的桶排序算法比这个更为复杂。

这是我第一次写博客,刚看完书,自己总结的一遍,代码是借鉴的是书上的并做了些改动。

如果有什么误解或者错误请大佬指正。

猜你喜欢

转载自blog.csdn.net/qq_36156580/article/details/91415941