`
sole
  • 浏览: 141505 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

计数排序

阅读更多

计数排序, 基数排序, 桶排序等非比较排序算法,平均时间复杂度都是O(n). 这些排序因为其待排序元素本身就含有了定位特征,因而不需要比较就可以确定其前后位置,从而可以突破比较排序算法时间复杂度O(nlgn)的理论下限.

计数排序是最简单的特例,它待排序元素是位于0到k之间的正整数 , 因而它是很特殊的情况,基本上没有特别的应用价值; 但是另一方面, 它又是基数排序的基础,或者说是一部分,所以简单的描述一下:

输入数组 A : 元素特征是 0-k的正整数,可以有重复值;

输出数组 B : 输出A的一个非减序列

中间数组 C : 大小是k, 它的i( 0<= i <= k)索引位置存储的是A元素集合中值是k的元素的个数有关.

 

算法的基本思想是:

  • 统计A中元素的值的集合, 以A中元素的值为索引, 将值的个数填写到中间数组C的对应处.
  • 对C从头开始自累加, 这样C中存储的就是, 当输入数组A中的值为当前索引时, 它前面的元素数量(包含重复元素).
  • 将C依次输出到输出数组B中.

Java实现代码:

 

public static int[] countSort(int[] A,int max){
		int[] C = new int[max+1];
		int[] B = new int[A.length];
		for(int i:A){
			C[i]+=1;
		}
		for(int i=1;i=0;--i){
			B[C[A[i]]-1] = A[i];
			C[A[i]]-=1;
		}
		return B;
	}



测试代码:

public static void main(String[] args) {
		int N = 1000;
		int[] A =new int[100];
		Random r = new Random(System.currentTimeMillis());
		for(int i=0; i<A.length; ++i){
			A[i] = r.nextInt(N);
		}
		int max=Integer.MIN_VALUE;
		for(int i:A){
			max = (i>max)?i:max;
		}
		System.out.println("输入数组元素:");
		System.out.println(Arrays.toString(A));
		int[] B = countSort(A,max);
		System.out.println("输出数组元素:");
		System.out.println(Arrays.toString(B));
		Arrays.sort(A);
		if(Arrays.equals(A, B)){
			System.out.println("Correct!!!");
		}else
			System.out.println("Error???");
		
	}
分享到:
评论

相关推荐

    计数排序算法实例

    计数排序是一种非基于比较的排序算法,它适用于待排序数据是整数的情况。这种算法的基本思想是通过统计每个整数出现的次数,然后利用这些信息来直接确定每个元素在输出数组中的位置。计数排序在某些特定情况下可以...

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

    ### 计数排序源代码C++实现 #### 知识点概述 计数排序是一种非比较型整数排序算法,其通过确定每个元素在最终排序数组中的位置来达到排序的效果,而无需相互比较。该算法适用于一定范围内的整数排序,并且在数据...

    C语言版的排序方法---计数排序.docx

    "C语言版的排序方法---计数排序" 计数排序是一种非比较排序算法,它的工作原理是通过统计每个元素在数组中的出现次数,然后根据这些统计结果将元素排列到正确的位置。下面是对计数排序的详细解释: 1. 初始化计数...

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

    计数排序是一种非基于比较的排序算法,它的主要思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数来确定每个元素在排序结果中的位置。这种算法特别适用于整数排序,且在数据范围不大的情况下,效率极...

    计数排序的算法实现

    计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。这种算法的基本思想是通过统计每个不同整数出现的次数,然后根据这些计数值来确定每个元素在排序结果中的位置。计数排序的时间复杂度为O(n)...

    超级经典的计数排序算法,号称效率达到了O(n)

    超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称...

    Java实现计数排序

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

    算法-计数排序

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

    计数排序(代码片段)

    计数排序(代码片段)

    排序算法之计数排序源代码另附博客地址

    排序算法之计数排序,计数排序是一种线性的排序算法,比基于比较的排序算法效率高,但其应用有特定的领域。我给出了两种策略的计数排序算法,欢迎下载~~如程序中有Bug,恳请指正!

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

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

    php计数排序算法的实现代码(附四个实例代码)

    计数排序是一种非比较型的排序算法,适用于一定范围内的整数排序。在该算法中,使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。计数排序的关键在于它不是比较两个元素的大小,而是统计每个...

    Python3实现计数排序(源代码)

    ### Python3实现计数排序(源代码) #### 实现原理 计数排序是一种非基于比较的排序算法,其核心思想是将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据...

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

    ### C++实现计数排序(源代码) #### 实现原理 计数排序是一种非比较型整数排序算法,其核心思想在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序算法,计数排序要求输入的...

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

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

    计数排序代码

    利用python实现计数排序,程序直接可以用

    JavaScript计数排序算法1

    JavaScript中的计数排序算法是一种非比较型排序算法,它的核心思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数直接确定每个元素在输出数组中的位置。由于这种算法是基于数字的出现频率来进行排序,...

    Python实现计数排序.rar

    计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。它的基本思想是通过确定每个输入元素出现的次数,然后利用这些信息来直接计算出每个元素在输出序列中的位置。计数排序是线性的,时间复杂度...

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

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

    java实现计数排序算法

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

Global site tag (gtag.js) - Google Analytics