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

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

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

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

    桶排序的思想就是把区间划分成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];   
    }   
}  
分享到:
评论

相关推荐

    桶排序算法的实现与比较

    3. 排序:对每个非空桶进行内部排序,可以选择合适的排序算法,如快速排序。 4. 合并:按照顺序依次处理每个桶,将已排序的桶内数据合并到全局有序序列中。 快速排序,另一方面,是基于分治策略的内部排序算法,由C...

    排序算法: 冒泡排序,桶排序,计数排序,堆排序,插入排序,合并排序,快速排序,基数排序,选择排序,希尔排序 实现语言: C

    计数排序是一种非基于比较的排序算法,通过统计每个元素出现的次数,然后根据这些计数确定每个元素的位置。适合于待排序的数据范围较小且非负的情况,时间复杂度为O(n+k)。 4. **堆排序**: 堆排序利用了堆这种...

    java版冒泡排序,插入排序,堆排序,快速排序,归并排序,希尔排序,桶排序

    归并排序和希尔排序在稳定性上有优势,而桶排序则对输入数据分布有特定要求。在实际应用中,根据数据特性选择合适的排序算法至关重要。在Java编程中,理解这些排序算法的实现和性能特点,有助于写出高效、适应性强的...

    桶排序算法

    桶排序算法基于分治策略,其核心思想是将待排序序列均匀地分布到有限数量的桶里,每个桶内的元素单独进行排序,最终再依次合并所有桶中的有序序列。 桶排序假设输入数据服从均匀分布,因此,首先需要确定一个合适的...

    C++写的希尔排序 归并排序 桶排序 堆排序 3种快速排序 插入排序等

    希尔排序、归并排序、桶排序、堆排序和快速排序都是经典的计算机算法,主要用于对数据进行排序。在C++编程语言中,这些排序算法的实现是程序员必须掌握的基础技能之一。接下来,我们将深入探讨这些排序算法的工作...

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

    7. 桶排序:桶排序假设输入数据服从均匀分布,将数据分布到多个桶中,每个桶再分别排序,最后合并所有桶的排序结果。时间复杂度可以达到线性O(n + k),其中k是桶的数量。桶排序的C语言实现如下: ```c // 省略桶...

    第3课 桶排序.pdf--

    桶排序是一种基于分配和收集的排序算法,特别适合于数据分布均匀且数据范围已知的情况。在C++编程中,桶排序能够高效地对一系列元素进行排序。根据提供的文件内容,我们可以总结以下知识点: 1. **桶排序的基本原理...

    C++排序算法对比(桶排序等)

    6. **桶排序**:桶排序是一种非比较型排序算法,适用于数据分布在一定范围内的场景。它将数据分布到多个“桶”中,每个桶内部再单独排序,最后按顺序依次收集所有桶中的元素。桶排序的时间复杂度可以达到线性的O(n +...

    线性排序:如何根据年龄给100万用户数据排序?.pdf

    2. **使用桶排序:** - 根据年龄范围(假设18-100岁),创建足够数量的桶(例如100个桶)。 - 将用户数据放入对应的桶中。 - 分别对每个桶中的数据进行排序。 - 按照桶的顺序合并所有桶中的数据。 #### 四、...

    桶排序:深入Hive桶技术及其应用

    1. **基于Hadoop**:Hive建立在Hadoop文件系统(HDFS)之上,可以处理存储在HDFS上的大数据集。 2. **SQL查询**:通过HiveQL,用户可以使用类似SQL的语法对数据进行查询和分析。 3. **数据摘要**:Hive支持对数据...

    基于桶排序的基数排序_radixsort.zip

    基于桶排序的基数排序_radixsort

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录

    9. 桶排序:桶排序假设输入数据均匀分布在一个范围内,并将数据分配到多个桶中,每个桶再单独排序。最后,按照顺序依次收集各个桶中的元素。最佳情况下的时间复杂度为O(n + k),k为桶的数量。 10. 基数排序:基数...

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

    8. **桶排序**:桶排序假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再单独排序。如果桶内数据较少,可以采用其他排序算法。桶排序的平均时间复杂度可以达到线性O(n + k),但最坏情况下可能退化为O(n...

    易语言源码易语言桶排序源码.rar

    - 桶内排序:对每个非空桶,使用易语言内置的排序函数或其他排序算法进行排序。 - 合并结果:从第一个非空桶开始,依次取出已排序的元素,组成最终的排序结果。 4. **注意事项** - 数据分布:桶排序的效率很大...

    Java排序算法(桶排序,基数排序等)

    桶排序假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再单独排序,最后合并所有桶的排序结果。桶排序的时间复杂度可以达到线性O(n + k),其中k是桶的数量。Java实现如下(未给出,需自行实现)。 9. ...

    13线性排序:如何根据年龄给100万用户数据排序?.pdf

    线性排序,包括桶排序、计数排序和基数排序,是一种效率较高的排序算法,其时间复杂度为O(n),这是由于它们不依赖于元素间的比较操作。这些算法适用于特定的数据特性,因此理解它们的适用场景至关重要。 桶排序的...

    排序算法总汇:介绍了各种排序的算法,配有代码,大家赶紧来学习哦

    8. 桶排序:桶排序假设输入是从一定范围内的均匀分布,将元素分配到多个桶中,每个桶再单独排序。理想情况下,时间复杂度为O(n + k)。 9. 基数排序:基数排序是按照数字的位数进行排序,从低位到高位逐个处理,适用...

    Python3实现桶排序(源代码)

    它属于非比较型排序算法之一,通过将输入的数据集合分割成几个部分(即“桶”),对这些部分分别进行排序,最终合并所有结果来获得完全排序后的数组。 **基本原理:** 1. **创建桶:** 首先确定桶的数量,然后为每...

Global site tag (gtag.js) - Google Analytics