`
hongjn
  • 浏览: 55186 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

计数排序(CountingSort) Java实现

阅读更多
/**
 * 计数排序
 */
public class CountingSort {

    /**
     * 输入数组的元素都是介于0..k之间的
     * @param data 待排序数组
     * @param k 最大元素
     * @return 排序结果
     */
    public static int[] sort(int[] data, int k) {
        // 存放临时数据的数组tmp,初始元素都是0;k为数组中最大元素
        int[] tmp = new int[k + 1];

        // 计算数组中每个元素i出现的次数,存入数组tmp中的第i项,即原数组中的元素值为tmp数组中的下标
        for (int i = 0; i <= data.length - 1; i++) {
            tmp[data[i]]++;
        }

        // 计算数组中小于等于每个元素的个数,即从tmp中的第一个元素开始,每一项和前一项相加
        for (int j = 1; j <= k; j++) {
            tmp[j] = tmp[j] + tmp[j - 1];
        }

        // result数组用来来存放排序结果
        int[] result = new int[data.length];
        for (int i = data.length - 1; i >= 0; i--) {
            result[tmp[data[i]] - 1] = data[i];
            tmp[data[i]]--;
        }

        return result;
    }
}
1
2
分享到:
评论
3 楼 hongjn 2011-10-17  
tan4836128 写道

缺点:该算法的的时间长度:data.length * (k+1),k为无限大的正整数,直接导致tmp的长度很大

多谢热心的朋友分析。另外,这算法的运行时间是Θ(n + k)
2 楼 tan4836128 2011-10-17  
我得给楼主拍砖,算法展示出来,同时要分析说明思路,执行过程,优缺点分析,否则大家伙怎么看啊,尤其是新手,望楼主三思
1 楼 tan4836128 2011-10-17  
测试

最大数K:10(大于6的数都行)
data:               2,3,1,2,3,2,1,2,3,4,5,5,6,5
第一次循环后tmp状态:0,2,4,3,1,3,1,0,0,0,0,
第二次循环后tmp状态:0,2,6,9,10,13,14,14,14,14,14,
result:             1,1,2,2,2,2,3,3,3,4,5,5,5,6,

分析

由于tmp修改了一次,第一次循环暂不用考虑,如下:
最大数K:10
data:  2,3,1,2,3,2,1,2,3,4,5,5,6,5
tmp:   0,2,6,9,10,13,14,14,14,14,14,
result:1,1,2,2,2,2,3,3,3,4,5,5,5,6,

利用:data.length = tmp最大值,tmp记录data各数值出现次数,并累加后重新对tmp赋值

data中的数值作为tmp中的数组下标,tmp中的值又作为result的数组下标,result每插入一个值,tmp中对应位置的值-1,直到排序完成

缺点:该算法的的时间长度:data.length * (k+1),k为无限大的正整数,直接导致tmp的长度很大

最后:该思路适用于数组数量较少的计算

相关推荐

    计数排序JAVA实现counting sort algorithm

    伪代码和算法介绍在此:http://www.algorithmist.com/index.php/Counting_sort,本程序是 根据这个伪代码编写的源代码

    Java实现计数排序

    Java实现计数排序不是C,Java实现计数排序不是C,Java实现计数排序不是C

    java实现计数排序算法

    countingSort 方法实现了计数排序算法。首先,我们遍历一遍原数组,找出其中的最大值,以确定计数数组的大小。然后,创建计数数组 count,并将每个元素的出现次数记录在计数数组中。接下来,根据计数数组中的元素...

    CountingSort:计数排序算法的实现

    麻省理工学院“算法导论”课程中介绍的计数排序算法的实现。 例子 var countingSort = require ( './countingSort.js' ) ; // Construct input [0, 5], therefore an array of size 6 is needed // for the ...

    [Java算法-排序练习]计数排序.java

    该资源提供了在Java中如何实现计数排序的全面指南。文档涵盖了计数排序的基本概念,包括如何对数组进行排序以及如何在Java中实现计数排序。此外,文档还包括一个逐步指南,介绍了如何在Java中实现计数排序,包括详细...

    计数排序介绍和java代码实现

    介绍计数排序的概念、特点、优缺点、适用场景和java代码简单实现。

    计数排序源代码C++实现

    计数排序 用C++实现 简单易懂 欢迎下载

    计数排序.py 使用python来实现

    计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数...

    AlgorithmMan by Iori(Counting Sort)

    CountingSort为AlgorithmMan中的计数排序演示工具(这是可执行文件;需要.net 4.0支持;非源代码)。 原文:C#算法设计排序篇之08-计数排序(附带动画演示程序) 链接:...

    计数排序算法的C语言实现

    以前看过网上的一篇关于一种号称时间复杂度能达到O(n)的不用比较就可以实现排序的算法——计数排序法,这是自己用C写的一个实现,大家可以参考下,欢迎指证。

    计数排序的算法实现

    计数排序的代码实现,对应分析在我的博客里找,学习和开发的随便下

    java 实现计数排序和桶排序实例代码

    主要介绍了java 实现计数排序和桶排序实例代码的相关资料,需要的朋友可以参考下

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

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

    一些简单排序的简单Java实现

    一些简单排序的简单Java实现,除了计数排序和基数排序 那两个不太懂,有的来自网上加上了一些自己的注释和解释,方便快速理解排序思想 用于我自己的笔记

    算法-计数排序

    主要是对算法导论中计数排序的实现

    经典算法的C#源码实现

    经典的排序算法C#源码,包括: 经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序...经典排序算法 - 计数排序Counting sort

    Java写的排序类(快速排序 堆排序 计数排序 桶排序 归并排序)

    //排序类 提供int排序的静态方法 有以下排序: 快速排序 堆排序 计数排序 桶排序 归并排序

    JavaScript计数排序算法1

    JavaScript计数排序算法计数排序算法计数排序(Counting sort)是一种稳定的线性时间排序算法。计数排序使用一个额外的数组,数组的下标对应待排序

    各种排序代码的JAVA实现

    包括了堆排序 归并排序 快速排序 基数排序 选择排序 冒泡排序 插入排序 希尔排序 计数排序 桶排序等算法。

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

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

Global site tag (gtag.js) - Google Analytics