`
128kj
  • 浏览: 584589 次
  • 来自: ...
社区版块
存档分类
最新评论

非基于比较的排序:桶排序

阅读更多
   我们最常用的快速排序和堆排序等算法需要对序列中的数据进行比较,因为被称为基于比较的排序。
   而非基于比较的排序有计数排序,桶排序,和在此基础上的基数排序。要注意的是,非基于比较的排序算法的使用都是有条件限制的,例如元素的大小限制。

假设待排序数据是一个随机过程产生,该过程将元素一致地分布在某区间上。

    桶排序的思想就是把区间划分成n个相同大小的子区间,或称桶,然后将输入数分布到各个桶中去。因为输入数均匀分布,所以一般不会有很多数落在一个桶中的情况。为得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列出来即可。

举个例子:一年的全国高考考生人数为500万,分数使用标准分,最低100,最高900,没有小数,你把这500万元素的数组排个序。一共可出现的分数可能有多少种呢?一共有900-100+1=801,创建801个“桶”,从头到尾遍历一次数组,对不同的分数给不同的“桶”加料.

   比如有个考生考了500分,那么就给500分的那个桶(下标为500-100)加1,完成后遍历一下这个桶数组,按照桶值,填充原数组,100分的有1000人,于是从0填到999,都填1000,101分的有1200人,于是从1000到2119,都填入101.于是经过这次遍历之后所有记录都是有序的了。
public static void bucketSort(int[] keys,int max){    
    int[] temp=new int[keys.length];//创建临时数组   
    int[] count=new int[max];//创建桶   
    //进桶,如果有重复的,那桶里的值为重复的次数   
    for(int i=0;i<keys.length;i++){   
        count[keys[i]]++;   
    }   
     // 计算“落入”各桶内的元素在有序序列中的位置

    for(int i=1;i<max;i++){   
        count[i]=count[i]+count[i-1];   
    }      
    //复制数组   
    System.arraycopy(keys, 0, temp, 0, keys.length);   
     // 根据count数组中的信息将待排序列的各元素放入相应位置

    for(int k=keys.length-1;k>=0;k--){   
        keys[--count[temp[k]]]=temp[k];   
    }   
}  
分享到:
评论

相关推荐

    基于C语言的排序方法汇总

    基于C语言的排序方法汇总, 主要包括有梳排序 、堆排序 、归并排序 、简单排序 、快速排序、桶排序 、基数排序等,用最基础的C语言实现排序方法,程序内部自动生成所要排序的数字。

    基于python的桶排序算法设计与实现

    基于python的桶排序算法设计与实现

    基于Qt5-实现九大排序算法的代码汇总

    本项目用C++中实现了冒泡排序、插入排序、堆排序、希尔排序、归并排序、基数排序、选择排序、桶排序、快速排序

    编程界非常经典的十大排序算法

    ⾮⽐较类排序:不通过⽐较来决定元素间的相对次序,它可以突破基于⽐较排序的时间下界,以线性时间运⾏,因此也称为线性时间⾮⽐较类排序。 冒泡排序 快速排序 简单插入排序 希尔排序 简单选择排序 堆排序 二路归并...

    MMC双层桶排序模型预测控制策略_模块化多电平_模型预测控制_电容排序_电容模型预测_mmc_

    提出一种基于桶排序的双层模型预测控制方法。对电容 电压进行桶排序,将电压排序后的子模块按次序等分为若干组,通过第一层模型预测控制确定需要插入桥臂的 组数,再通过第二层模型预测控制进一步确定需要插入的子...

    基于python进行桶排序与基数排序的总结

    一、桶排序: 排序一个数组[5,3,6,1,2,7,5,10] 值都在1-10之间,建立10个桶: [0 0 0 0 0 0 0 0 0 0] 桶 [1 2 3 4 5 6 7 8 9 10] 桶代表的值 遍历数组,第一个数字5,第五个桶加1 [0 0 0 0 1 0 0 0 0 0] 第二个数字...

    基于桶排序的EDF调度算法优化 (2013年)

    EDF调度算法在系统过载的情况下,就不能有效地实时调度系统中的所有任务,使任务...仿真实验表明,优化后的EDF调度算法的截止期错失率,明显比优化前低,说明基于桶排序的EDF调度算法的实时任务截止期错失率比EDF调度算法低.

    桶排序(Bucket Sort)

    桶排序算法是一种基于计数的排序算法,其基本思想是先扫描一遍待排序的序列,找出最大值和最小值,然后根据最大值和最小值确定桶的个数,并将每个元素分配到对应的桶中,最后将每个桶中的元素进行排序,然后依次输出...

    基于双向链表的基数排序

    基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,需要将关键字拆分成数字位。并且按照数字位的值对数据项进行排序,这种方法不需要进行比较操作。 为了尽可能少的...

    各种排序算法比较实现

    主要的基于比较的排序算法有归并排序、插入排序、快速排序,本程序对这些算法都进行了实现和数据测试。同时也实现了计数排序、基数排序、桶排序等非比较排序算法。

    排序 算 法

    排序 桶 快速 冒泡

    基于java实现的10种基本排序方式

    用java实现了10种基础排序,其内容包括: 1.冒泡排序 2.选择排序 3.插入排序 4.快速排序 5.希尔排序 6.归并排序 7.堆排序 8.桶排序 9.基数排序 10.计数排序 如有疑问请私信我

    几种常见排序算法实现

    基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起...

    大数据情况下桶排序算法的运用与C++代码实现示例

    由于同一桶中的记录其关键字不尽相同,所以必须采用关键字比较的排序方法(通常用插入排序)对各个桶进行排序,然后依次将各非空桶中的记录连接(收集)起来即可。 注意: 这种排序思想基于以下假设:假设输入的n个...

    C++线性时间的排序算法分析

    本文将介绍三种非比较的排序算法:计数排序,基数排序,桶排序。它们将突破比较排序的Ω(nlgn)下界,以线性时间运行。 一、比较排序算法的时间下界 所谓的比较排序是指通过比较来决定元素间的相对次序。 “定理:...

    深入解析桶排序算法及Node.js上JavaScript的代码实现

    桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。当要被排序的数据内的数值是...

    基于c++语言的排序算法

    快排 直接选择排序 直接插入排序 归并排序 桶排序(简单版) 基数排序 是一个word文档,可能需要修改后使用

    基数排序_RADIXSORT

    基数排序的排序工作在线性时间之内就可以完成,速度非常之快,这里给出了基于计数排序和桶排序的两种类型的基数排序算法

    十大排序算法.ipynb

    冒泡排序、插入排序、选择排序、快速排序、堆排序、归并排序、希尔排序、计数排序、桶排序、基数排序,python实现

Global site tag (gtag.js) - Google Analytics