前摆桶排序(Bucket sort )和所谓的箱子排序是一种排序算法,原理是将数组分成有限数量的桶。 对每个桶分别排序。 您可以使用其他排序算法,也可以继续使用桶排序递归排序。 桶排序是鸽巢排序的总结结果。 如果要排序的数组中的数值是均匀分配的,则桶排序使用线性时间((n ) )。 但是,桶排序不是比较排序,不受o(nlogn )下限的影响。
源代码Sim_buck_sort.c
#includestdio.hintmain(void ) ) { int a[11],I,j,t; for(I=0; i=10; I ) a(I )=0; //initializeto0for(I=1; i=5; I//loopin5numbers{scanf('%d ',t ); //readeachofthesenumbersintovariableta [ t ]; //tocount}for(I=0; i=10; I//a[0]~a[10]for(j=1; j=a[i]; j//itappearsafewtimesandprintsafewtimesprintf (' % d ',I ); 打印((n ); getchar (; //pausetheprogramtoseewhattheprogramoutputsgetchar (; 返回0; )假设需要对5个同学的成绩进行排名,分数为0~10。
程序必须创建数组,大小为11。 其下标分别表示0~10的11个个数。 在for循环中输入5个个数,计数对应的数组元素即可完成排序。
最后一个输出根据数组元素的值打印分数。 每个数组元素的值表示有多少这样的分数。 例如,下标为0的数组值为3时依次输出0 3次,下标为8的数组值为5时依次输出8 5次……。
Sim_buck_sort2.c
# include stdio.hint main ((intbook [ 1001 ],I,j,t,n; for(I=0; i=1000; I ) book[i]=0; scanf('%d ',n ); //thatmeanswehavennumbersfor (I=1; i=n; I//loopthroughnnumbersandsort { scanf (' % d ',t ); 书[ t ]; //tocount}for(I=1000; i=0; I---//judgethedrumsnumbered 1000至0 insequencefor (j=1; j=book[i]; j//itappearsafewtimesandprintsafewtimesprintf (' % d ',I ); 打印((n ); getchar (; getchar (; 返回0; }如果需要排序的最大值为1000,则数组大小必须为0到1000 (10001)。
n表示需要排序的数量,这n个将按顺序计数对应的数组元素。 最后把这些数从大到小输出。
总结该算法的时间复杂度为O(M N )。 这是一种非常快速的排序算法。 但是,那是非常浪费的空间。