`
hongjn
  • 浏览: 56068 次
  • 性别: 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

    Java实现计数排序的关键步骤如下: 1. **初始化计数数组**:创建一个与待排序数组最大值相等长度的计数数组,所有元素初始化为0。 2. **计数过程**:遍历待排序数组,对于每个元素,将其值作为索引增加计数数组...

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

    计数排序介绍和Java代码实现 计数排序是一种非比较的线性时间复杂度排序算法,它通过统计每个元素在待排序数组中出现的次数,然后根据统计信息将元素放回原数组中,从而实现排序。下面是计数排序的详细介绍。 计数...

    java实现计数排序算法

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

    计数排序算法介绍以及使用Java语言实现

    ### 计数排序算法介绍及Java实现 #### 一、计数排序算法基本概念 计数排序(Counting Sort)是一种非比较型的线性时间复杂度排序算法,其核心思想在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种...

    8种常用排序方法java类实现

    8. **计数排序(Counting Sort)**:计数排序适用于非负整数,通过统计每个数字出现的次数,然后计算出每个元素的最终位置。虽然不是基于比较的排序,但在特定场景下效率很高。Java实现时,需要额外的数组来存储计数...

    Java实现计数排序算法(源代码)

    ### Java实现计数排序算法详解 #### 一、概述 计数排序是一种高效的非比较型整数排序算法,尤其适用于已知数据范围内非负整数的排序任务。它通过统计数组中每个数值出现的频率来确定各个数值在排序后数组中的确切...

    三种线性排序算法Java实现

    本资源提供的Java实现包括了三种线性排序算法:桶排序(Bucket Sort)、基数排序(Radix Sort)和计数排序(Counting Sort)。这三种算法在特定条件下可以达到线性的平均或最好时间复杂度,效率相对较高。 1. **桶...

    详解Java常用排序算法-计数排序

    在 Java 中,计数排序可以使用以下代码实现: ```java public class Counting { public static void countingSort(int[] arr) { int n = arr.length; // 取出数组中最大值 int max = getMax(arr); int[] count ...

    排序算法9种--java实现

    7. 计数排序(Counting Sort):计数排序不是基于比较的排序算法,适用于非负整数排序。统计每个数出现的次数,然后根据统计结果进行排序。Java实现时,需要创建一个计数数组来存储每个数出现的频率。 8. 桶排序...

    Java实现八大排序算法

    8. **计数排序(Counting Sort)**:计数排序是一种非基于比较的排序算法,适用于待排序元素范围不大的情况。它统计每个元素出现的次数,然后根据这些计数确定每个元素的最终位置。Java实现计数排序时,需要创建一个...

    各种排序算法java实现

    8. **计数排序**(Counting Sort)、**桶排序**(Bucket Sort)和**基数排序**(Radix Sort):这些是非比较型排序算法,适用于特定类型的数据,如整数排序,它们可以达到线性时间复杂度。 博客链接中可能包含了...

    常见的八大排序算法及其JAVA实现

    void countingSort(int[] arr) { int max = Arrays.stream(arr).max().getAsInt(); int[] count = new int[max + 1]; for (int num : arr) { count[num]++; } int index = 0; for (int i = 0; i ; i++) { ...

    排序算法-java实现

    7. **计数排序**(Counting Sort)、**桶排序**(Bucket Sort)和**基数排序**(Radix Sort):这三种排序算法属于非比较型排序,适用于特定类型的数据。例如,基数排序适用于整数排序,根据每一位进行排序。它们的...

    8大排序java实现

    8. **计数排序(Counting Sort)**: 计数排序适用于非负整数,通过统计每个数出现的次数,然后根据统计结果直接确定每个数的位置。 每种排序算法都有其适用场景和优缺点。例如,直接插入排序和简单选择排序简单...

    java实现排序算法

    7. 计数排序(Counting Sort) 计数排序不是基于比较的排序算法,它通过计算每个元素在待排序序列中出现的次数,然后根据这些计数值来确定每个元素在输出序列中的位置。由于计数排序只适用于非负整数,因此在Java中...

    java中的各种排序实现

    7. 计数排序(Counting Sort) 计数排序适用于非负整数排序,统计每个数字出现的次数,然后根据这些次数确定每个元素的位置。时间复杂度为O(n+k),其中k是数值范围,但不适用于大范围的整数。 8. 桶排序(Bucket ...

    十种排序的Java代码实现

    7. 计数排序(Counting Sort):计数排序不是基于比较的排序,而是统计每个元素出现的次数,然后根据这些计数重建出有序序列。适用于整数排序,且范围不太大的情况。 8. 桶排序(Bucket Sort):桶排序将待排序元素...

Global site tag (gtag.js) - Google Analytics