Java排序算法8:桶排序
来源:互联网 发布:博雅软件新三板 编辑:程序博客网 时间:2024/05/22 17:12
一.思想:
前提:1.待排序序列处于一个可枚举的范围之中。2.可枚举的范围不应该太大,否则开销太大。
首先构建一个Buckets数组,用于记录落入桶内的元素个数,然后,再对Buckets数组进行重新计算,可以得出每个待排序的元素在有序序列中的位置。在这个过程中,需要对每个桶中的若干个元素又进行排序,当然如果这个桶中只有一个元素则不需要。如下面的例子,定义了10个桶,所有每个桶内的元素是一样的,假如定义了2,3个桶,那么则需要在桶内重新排序。
二.例子:
比如5,4,6,6,2,
1.创建长度为num.length的Buckets数组,创建temp数组,把5,4,6,6,2复制到temp数组中。
2.记录落入每个桶中的元素个数,利用Buckets[num[i]]++。比如num[0]=5,那么buckets[5]=1,说明在5号桶中有一个元素,数值为5。再比如num[3]=6,num[4]=6,则buckets[6]=2,说明落入6号桶中的元素有2个,数值为6.其他以此类推。那么最后结果为buckets[2]=1,buckets[4]=1,buckets[5]=1,buckets[6]=2
3.计算每个元素在有序序列中的位置。通过buckets[i]=bucket[i]+buckets[i-1];比如bucket[2],因为buckets[0]和buckets[1]都没有东西,所以说buckets[2]还是等于1,也就是说在有序序列中的第1位,对于buckets[4],buckets[4]=buckets[4]+buckets[3],那么buckets[3]又等于buckets[2],其实就相当于算bucket[4]前面有多少个元素,那么buckets[4]前面只有buckets[2]这一个元素,所以buckets[4]=2,也就是说buckets[4]排在第2位,其他依次类推。
4.知道了每个元素排在多少位,再利用num[--buckets[temp[j]]] = temp[j];把temp数组的元素依次重新放入num数组中,最后就可以完成排序。对于num[--buckets[temp[j]]] = temp[j];最好是拿纸拿笔写出来一步一步理解。
三.实现代码:
public class BucketsSort {public static void main(String args[]){int num[] = {4,3,6,9,5,3,2,3,1};System.out.print("原始数据:");print(num);Bucketsort(num,0,10);System.out.print("排序后数据:");print(num);}public static void Bucketsort(int num[],int min,int max){int i,j;int temp[] = new int[max - min];int buckets[] = new int[max - min];//记录每个元素在序列中出现的次数for(i = 0; i < num.length; ++i){buckets[num[i]]++;}//计算“落入”桶内的元素在有序序列中的位置for(i = 1; i < max; ++i){buckets[i] = buckets[i] + buckets[i - 1];}//将num[]中的数据完全复制到temp[]数组System.arraycopy(num, 0, temp, 0, num.length);//根据buckets数组中的信息将待排序列的各元素放入相应的位置for(j = num.length - 1; j >= 0; --j){num[--buckets[temp[j]]] = temp[j];}}public static void print(int num[]){int i;for(i = 0; i < num.length; ++i){System.out.print(num[i]+" ");}System.out.print("\n");}}
四.复杂度和应用:
时间复杂度为:O(n+k) k表示排序数据的范围 空间复杂度为::取决于n(需要创建temp数组)和k(桶的大小)
应用:适用于元素范围不大的情况,也适用于海量计算,比如说高考500万考生,需要考试成绩排序,那么成绩0--750分,就可以定义750个桶。
五.参考资料:
1.追竹的博客:http://blog.csdn.net/apei830/article/details/6596057
2.百度百科-桶排序:http://baike.baidu.com/view/1784217.htm?fr=wordsearch
六:相关排序代码下载:包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址:http://download.csdn.net/detail/u014077165/7185895
- Java排序算法8:桶排序
- 排序算法---桶排序[Java]
- Java排序算法---->桶排序算法
- java排序算法_004桶排序
- Java排序算法(十)--桶排序
- [排序算法]--桶排序的Java实现
- 【排序算法】桶排序
- 排序算法-桶排序
- 排序算法-桶排序
- 排序算法----桶排序
- 排序算法---桶排序
- 排序算法:桶排序
- Java 8大排序算法
- Java 8大排序算法
- Java 8大排序算法
- Java-8种排序算法
- Java排序算法: 冒泡排序
- Java排序算法 快速排序
- 如何查看SharePoint的版本信息
- PHP随机产生指定长度字符串
- 从本地读取文件到hdfs中注意事项
- Android加载图片引起的OOM解决方案(转)
- 深入剖析iLBC 解码器原理
- Java排序算法8:桶排序
- Ext JS 5初探(三)
- 认识DOM和DOM加载过程以及如何让DOM加载完成后再执行js脚本文件
- Java序列化与反序列化
- MYSQl 的连接
- 8热键HOT Key
- matlab中的ezplot3函数
- 华为章宇:如何学习开源项目及Ceph的浅析
- java 正则表达式