`
thingkau
  • 浏览: 74618 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

排序【计数排序】

阅读更多
思想:
设置数组b、c,c用于放置a数组中每个元素的值出现的次数,然后得出a中元素<=i的元素个数再次放入c中,其中c的下标对应于a中每个元素的值.此时c[a[i]-1]就是a[i]在b中的位置.
这种排序适用于待排序的数组元素最大值已经给定的情况下使用,而且待排序的每个元素都>=0。计数排序是一种线性时间复杂度的排序,设定a[0:N-1]中元素的最大值为M,这排序的时间复杂度O(M+N)。


/**
 * CountingSort.java
 * 计数排序
 * @author Administrator
 */
public class CountingSort {

	/**
	 * 无序数组a的元素满足必须有一个最大值为m(m>=0)最小值不小于0
	 */
	public static void countingSort(int[] a, int m) {
		
		int n = a.length;
		
		int[] b = new int[n];
		
		int[] c = new int[m + 1];
		
		/*
		//对c语言是必须的
		
		for(int i = 0; i <=m; i ++)
			c[i] = 0;
		*/
		
		
		//存放a中元素等于i的元素个数.
		for(int i = 0; i < n; i ++)
			c[a[i]] += 1;
		
		//存放a中元素<=i的元素个数.
		for(int i=1; i <= m; i ++)
			c[i] += c[i-1];
		
		//把a中每个元素放入b中正确的位置.
		for(int i = n; i >0; i --)
		{
			
			b[c[a[i - 1]] - 1] = a[i - 1];
			c[a[i - 1]] -= 1;//a中如果有元素的值相等此句是必须的.
			
		}
		
		//把b[0:n-1]的元素复制到a中 
		Util.copy(a, b, 0, n-1);
		
	}

	public static void main(String[] args) throws Exception {

		if (args.length == 0) {
			System.out.println("请输入数字(>=0)以空格隔开");
			System.exit(-1);
		}

		int[] a = new int[args.length];

		for (int i = 0; i < args.length; i++)

			a[i] = Integer.parseInt(args[i]);

		//检查输入元素的值.
		for(int i=0; i< a.length; i++)
			if(a[i]<0){System.out.println("每个元素的值不小于0");System.exit(-

1);}

		//获取输入元素的最大值对应的下标.
		int mid = 0;
		for(int i = 0 ; i < a.length-1; i++){
		  if(a[mid] < a[i+1]) mid = i+1;
		}

		countingSort(a, a[mid]);

		// 输出排序后的数组元素。
		for (int i = 0; i < a.length; i++)
			System.out.println(a[i]);

	}

}
分享到:
评论

相关推荐

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

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

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

    Java 排序算法 - 计数排序 计数排序(Counting Sort)是一种非比较排序算法,它的基本思想是统计数组中每个元素出现的次数,然后根据元素出现的次数依次将元素放入有序的数组中。计数排序时间复杂度为 O(n+k),其中...

    冒泡排序计数.zip

    在"冒泡排序计数.zip"这个压缩包中,包含了一个名为"冒泡排序计数.c"的源代码文件,很可能是用C语言实现的冒泡排序算法,并且还包含了多个以数字命名的输入文件(如6.in、1.in等)。这些输入文件通常用于测试程序,...

    计数排序算法实例

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

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

    计数排序作为排序算法中的一个重要分支,尽管它并不基于元素间的比较操作,却以其独特的方式解决了特定范围内的整数排序问题。计数排序的核心思想在于统计每个待排序数值在原数组中的出现频率,然后依据这些频率信息...

    Java实现计数排序

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

    算法-计数排序

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

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

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

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

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

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

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

    计数排序(代码片段)

    计数排序(代码片段)

    三种排序算法主要过程图示

    今天,我们将介绍三种常见的排序算法:计数排序、基数排序和桶排序。 计数排序 计数排序是一种非比较排序算法,通过统计每个数字出现的次数来实现排序。其主要过程可以分为以下几个步骤: 1. 找到待排序数组中的...

    排序总结(选择、插入、冒泡、希尔、快速、箱子、基数、归并、堆)

    根据给定的信息,本文将对九种不同的排序算法进行详细解析:选择排序、插入排序、冒泡排序、希尔排序、快速排序、箱子排序(计数排序)、基数排序、归并排序以及堆排序。 ### 一、选择排序 选择排序的基本思想是...

    计数排序的算法实现

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

    数字排序算法

    而非比较排序则不依赖于元素间的比较,而是基于元素的特定属性,如基数排序、计数排序和桶排序等。 ### 比较排序算法详解 #### 冒泡排序 冒泡排序是最基础的排序算法之一,其基本思想是重复地走访过要排序的数列,...

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

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

    十大排序算法.pdf

    在计数排序中,首先要找到待排序数组中最大和最小的元素,然后创建一个计数数组,统计每个元素的出现次数。最后根据计数数组从大到小输出对应的元素即可。计数排序不是基于比较的排序算法,其时间复杂度为O(n+k),...

    算法与分析实验3: 利用预排序、堆排序和计数排序解决排序问题

    实验要求学生基于预排序、堆排序和计数排序三种算法实现排序功能,并对核心代码进行时间复杂度和空间复杂度的分析。 **预排序算法**: 预排序算法的主要目的是检验数组中元素的唯一性。通过先对数组进行排序,然后...

    插入排序,合并排序,堆排序,快速排序,计数排序c++实现

    这些代码是对算法导论上对排序部分的总结,实现了以下排序方法:插入排序,合并排序,堆排序,快速排序,计数排序,每种实现都有详细的注释和相应的测试程序,可查找http://blog.csdn.net/china8848&lt;br&gt;中对相关问题...

    排序算法时间复杂度的研究.pdf

    - 时间复杂度:计数排序的时间复杂度主要取决于输入数据的范围 \(k\) 和输入数据的数量 \(n\),通常表示为 \(O(n+k)\)。在最坏的情况下,即所有元素的值域都不同且非常大时,时间复杂度退化为 \(O(n^2)\)。 #### 2....

Global site tag (gtag.js) - Google Analytics