`
thingkau
  • 浏览: 72541 次
  • 性别: 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]);

	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics