排序【计数排序】

思想:
设置数组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]);

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值