用JAVA实现桶排序:
<b>import</b> java.util.ArrayList; <b>import</b> java.util.Arrays; <b>import</b> java.util.Collections; <b>import</b> java.util.List; <font><i>/* * Java程序使用基数排序算法对整数数组进行排序。 * input: [80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 50] * output: [0, 10, 20, 30, 40, 50, 50, 60, 70, 80, 90] * * 解决方案的时间复杂性: * 最佳情况O(n); 平均情况O(n); 最坏情况O(n ^ 2)。 * */</i></font><font> <b>public</b> <b>class</b> BuckeSort { <b>public</b> <b>static</b> <b>void</b> main(String[] args) { System.out.println(</font><font>"Bucket sort in Java"</font><font>); <b>int</b>[] input = { 80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 50 }; System.out.println(</font><font>"integer array before sorting"</font><font>); System.out.println(Arrays.toString(input)); </font><font><i>// sorting array using radix Sort Algorithm</i></font><font> bucketSort(input); System.out.println(</font><font>"integer array after sorting using bucket sort algorithm"</font><font>); System.out.println(Arrays.toString(input)); } </font><font><i>/** * * @param input */</i></font><font> <b>public</b> <b>static</b> <b>void</b> bucketSort(<b>int</b>[] input) { </font><font><i>// get hash codes</i></font><font> <b>final</b> <b>int</b>[] code = hash(input); </font><font><i>// create and initialize buckets to ArrayList: O(n)</i></font><font> List[] buckets = <b>new</b> List[code[1]]; <b>for</b> (<b>int</b> i = 0; i < code[1]; i++) { buckets[i] = <b>new</b> ArrayList(); } </font><font><i>// distribute data into buckets: O(n)</i></font><font> <b>for</b> (<b>int</b> i : input) { buckets[hash(i, code)].add(i); } </font><font><i>// sort each bucket O(n)</i></font><font> <b>for</b> (List bucket : buckets) { Collections.sort(bucket); } <b>int</b> ndx = 0; </font><font><i>// merge the buckets: O(n)</i></font><font> <b>for</b> (<b>int</b> b = 0; b < buckets.length; b++) { <b>for</b> (<b>int</b> v : buckets[b]) { input[ndx++] = v; } } } </font><font><i>/** * * @param input * @return an array containing hash of input */</i></font><font> <b>private</b> <b>static</b> <b>int</b>[] hash(<b>int</b>[] input) { <b>int</b> m = input[0]; <b>for</b> (<b>int</b> i = 1; i < input.length; i++) { <b>if</b> (m < input[i]) { m = input[i]; } } <b>return</b> <b>new</b> <b>int</b>[] { m, (<b>int</b>) Math.sqrt(input.length) }; } </font><font><i>/** * * @param i * @param code * @return */</i></font><font> <b>private</b> <b>static</b> <b>int</b> hash(<b>int</b> i, <b>int</b>[] code) { <b>return</b> (<b>int</b>) ((<b>double</b>) i / code[0] * (code[1] - 1)); } } Output Bucket sort in Java integer array before sorting <p>[80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 50] integer array after sorting using bucket sort algorithm <p>[0, 10, 20, 30, 40, 50, 50, 60, 70, 80, 90] </font>
桶排序 需要记住的重点:
1)Bucket Sort也称为bin sort,因为您创建Bucket或bin来对输入进行排序。
2)Bucket排序仅在输入均匀分布在一个范围内(如硬币、数字1到100等)时才有用。
3)可以使用链表或数组作为存储桶。数据结构的选择会影响插入时间。也可以将哈希表用作存储桶。
4)bucket排序是一种罕见的O(N)排序算法,即bucket排序的时间复杂度是最佳和平均情况下的线性函数,而不是像quicksort或mergesort那样的NLogN。
5)Bucket排序不是一个稳定的排序算法,因为在一个稳定的算法中,如果两个输入相同,它们将按排序顺序保留它们的位置,而在存储桶中,它取决于您对单个存储桶的排序方式。 不过,桶排序也可以变得稳定,称为基数排序。
6)您可以通过递归调用bucket排序或使用单独的排序算法(例如插入排序、冒泡排序或快速排序)对单个bucket中的元素进行排序。
7)Bucket排序是原地排序算法吗?不,它不是。整个想法是输入在移动到桶时自行排序。在最糟糕的情况下(顺序值,但不重复),所需的额外空间与原始数组一样大。
8)Bucket排序的最坏情况复杂性,当所有元素最终都在同一个桶中时为O(n ^ 2),因为它必须通过不同的排序算法进行排序。
9)bucket排序的空间复杂度为o(n),因为即使对无重复的顺序值进行排序,也需要一个与原始数组一样大的数组。