算法排序之最简单最快的排序--桶排序(Bucket Sort)

桶排序(Bucket Sort):主要原理是将数组分到有限数量的桶子里,每个桶子再按个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。

桶排序相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度能达到O(N)。当然桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也会非常多,则空间代价无疑是昂贵的。

PS:此次我分享的并不是真正的桶排序算法,而是简化版桶排序,让初学算法排序的童学更易懂上手!

        接下来就开始主人公出场喽。

        在一次期末考试完了老师要将童学们的分数按照从高到低排序,咱们班一共10位童学,此时老师要让计算机将这10个分数输出,那我们该怎么做呢?

首先我们要申请101个桶book[101],分别表示分数0~100分,刚开始将book[0]~book[100]都初始化为0,表示这些分数都还没有人得过,当出现分数时我们就相对应的将a[i]的值添加1,最后将出现过分数的下标打印出来即可。 

        是不是发现很简单吧! 那我们就用程序来实现一下,这在我主要就提供Java代码(10个分数将是每次随机生成),别的语言大家感兴趣都是可以自己编写的。

	public static void main(String[] args) {
		
		long startTime = System.currentTimeMillis();
		bucketSort(10, 100);
		long endTime = System.currentTimeMillis();
		System.out.println("\n" + (endTime - startTime));
	}
	
	public static void bucketSort(Integer input, Integer rand) {
		
		int[] book = new int[rand + 1];
		for (int i = 0; i < book.length; i++) {
			book[i] = 0;
		}
		Random r = new Random();
		for (int i = 0; i < input; i++) {
			
			int num = r.nextInt(rand);
			for (int j = 0; j < book.length; j++) {
				
				if (num == j) {
					book[j] ++;
				}
			}
		}
		
		for (int i = book.length -1 ; i >= 0; i--) {
			
			for (int j = 1; j <= book[i]; j++) {
				System.out.print(i + " ");
			}
		}
	}

       最后我们再来看一下算法的时间复杂度,在不包括随机数遍历的过程,此种简化版桶排序的时间复杂度应该为O(N+M),当然桶的数量非常多时,内存开辟的空间依然是个问题。
       好,那我们最简单最快的排序就讲述完了。 但你们有没有发现一个问题呢? 老师一般在按分数排名的时候,最终想要看的是童学的名字,并不是分数。而此种排序无法对人本身进行排序, 那你会问有木有别的什么排序呢?  答案是:肯定有。
       期待我下一篇的文章分享。。  算法排序之邻居好说话–冒泡排序!

点赞