vlambda博客
学习文章列表

啊哈!算法 1.1桶排序

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

桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到 O(n log n) 下限的影响。此外,桶排序是稳定的。

说人话:把数放入桶中,把桶里有数的输出。

#include <stdio.h>
int main(int argc, const char * argv[]) { int a[11], i, j, t;    //初始化为0数组,即每个桶中都没有数 for (i=0; i<=10; i++) { a[i]=0; }
//读入5个数 for (i=1; i<=5; i++) { scanf("%d", &t);        a[t]++;  //计数,每来一个数,对应的桶里多放入一个 }
//桶排序 for (i=0; i<=10; i++) { //查看每个桶a[0]~a[10]        for (j=1; j<=a[i]; j++) {  //出现几次就输出几次 printf("%d ",i); } } //system("pause"); return 0;}//ps:如果要求从大到小排序,把17行 for (i=0; i<=10; i++) {//改成 for (i=10; i>=0; i--) {
输入数据:5 3 5 2 8输出结果:2 3 5 5 8

下面再看另一个情况

#include <stdio.h>int main(int argc, const char * argv[]) { //给数字a换个更贴切的名字book,book单词有记录、标记的意思^_^ //代码是给程序员读的,也方便自己,不然时间久了自己都不知道a数组是干嘛的,book就知道是在标记数组 int book[1001],i,j,t,n; for (i=0; i<=1000; i++) { book[i] = 0;//初始化为0数组,即每个桶中都没有数 } scanf("%d", &n);//n个待排序的数 //读入n个数 for (i=1; i<=n; i++) { scanf("%d", &t); book[t]++; //计数,每来一个数,对应的桶里多放入一个 }  //桶排序 for (i=0; i<=1000; i++) { //查看每个桶a[0]~a[10] for (j=1; j<=book[i]; j++) { //出现几次就打印几次 printf("%d ",i); } } return 0;}
输入数据:88 999 50 10 80 23 34 50输出结果:8 10 23 34 50 50 80 999

当输入数据个数远小于桶的个数时(N为排序个数,M为桶的个数),此时桶排序的时间复杂度为O(M+N)=O(M)远大于O(N),因此,当排序个数少,但是数却跨度很大时,会造成浪费。如上,排序8个数,却要1000个桶。这时候可以选择直接插入排序或者直接选择排序。这次先不拓展了,以后有机会再说~

与你一起,站在巨人的肩膀上看世界。