计数排序(Countsort)之Java实现

目录(?)[+]

计数排序算法介绍

比较排序算法可以通过决策树模型证明,其下线是O(nlgn)。而本文介绍的是时间效率为O(n)的计数排序所谓排序算法,无非就是把正确的元素放到正确的位置,计数排序就是计算相同key的元素各有多少个,然后根据出现的次数累加而获得最终的位置信息。但是计数排序有两个限制条件,那就是存在一个正整数K,使得数组里面的所有元素的key值都不大于N,且key值都是非负整数。

计数排序算法Java实现

计数排序算法步骤大概有三个步骤:

  1. 建一个长度为K+1的的数组C,里面的每一个元素初始都置为0(Java里面默认就是0)。
  2. 遍历待排序的数组,计算其中的每一个元素出现的次数,比如一个key为i的元素出现了3次,那么C[i]=3。
  3. 累加C数组,获得元素的排位,从0开始遍历C, C[i+1]=C[i]+C[i-1]
  4. 建一个临时数组T,长度与待排序数组一样。从数组末尾遍历待排序数组,把元素都安排到T里面,直接从C里面就可以得到元素的具体位置, 不过记得每处理过一个元素之后都要把C里面对应位置的计数减1。

具体的排序以及测试代码如下:

  1. publicclassCountSort{
  2. publicstaticvoidmain(String[]args)throwsException{
  3. int[]array={9,8,7,6,5,4,3,2,6,1,0};
  4. System.out.println("Beforesort:");
  5. ArrayUtils.printArray(array);
  6. countSort(array,9);
  7. System.out.println("Aftersort:");
  8. ArrayUtils.printArray(array);
  9. }
  10. publicstaticvoidcountSort(int[]array,intrange)throwsException{
  11. if(range<=0){
  12. thrownewException("rangecan'tbenegativeorzero.");
  13. }
  14. if(array.length<=1){
  15. return;
  16. }
  17. int[]countArray=newint[range+1];
  18. for(inti=0;i<array.length;i++){
  19. intvalue=array[i];
  20. if(value<0||value>range){
  21. thrownewException("arrayelementoverflowrange.");
  22. }
  23. countArray[value]+=1;
  24. }
  25. for(inti=1;i<countArray.length;i++){
  26. countArray[i]+=countArray[i-1];
  27. }
  28. int[]temp=newint[array.length];
  29. for(inti=array.length-1;i>=0;i--){
  30. intvalue=array[i];
  31. intposition=countArray[value]-1;
  32. temp[position]=value;
  33. countArray[value]-=1;
  34. }
  35. for(inti=0;i<array.length;i++){
  36. array[i]=temp[i];
  37. }
  38. }
  39. }

计数排序算法介绍

比较排序算法可以通过决策树模型证明,其下线是O(nlgn)。而本文介绍的是时间效率为O(n)的计数排序所谓排序算法,无非就是把正确的元素放到正确的位置,计数排序就是计算相同key的元素各有多少个,然后根据出现的次数累加而获得最终的位置信息。但是计数排序有两个限制条件,那就是存在一个正整数K,使得数组里面的所有元素的key值都不大于N,且key值都是非负整数。

计数排序算法Java实现

计数排序算法步骤大概有三个步骤:

  1. 建一个长度为K+1的的数组C,里面的每一个元素初始都置为0(Java里面默认就是0)。
  2. 遍历待排序的数组,计算其中的每一个元素出现的次数,比如一个key为i的元素出现了3次,那么C[i]=3。
  3. 累加C数组,获得元素的排位,从0开始遍历C, C[i+1]=C[i]+C[i-1]
  4. 建一个临时数组T,长度与待排序数组一样。从数组末尾遍历待排序数组,把元素都安排到T里面,直接从C里面就可以得到元素的具体位置, 不过记得每处理过一个元素之后都要把C里面对应位置的计数减1。

具体的排序以及测试代码如下:

  1. publicclassCountSort{
  2. publicstaticvoidmain(String[]args)throwsException{
  3. int[]array={9,8,7,6,5,4,3,2,6,1,0};
  4. System.out.println("Beforesort:");
  5. ArrayUtils.printArray(array);
  6. countSort(array,9);
  7. System.out.println("Aftersort:");
  8. ArrayUtils.printArray(array);
  9. }
  10. publicstaticvoidcountSort(int[]array,intrange)throwsException{
  11. if(range<=0){
  12. thrownewException("rangecan'tbenegativeorzero.");
  13. }
  14. if(array.length<=1){
  15. return;
  16. }
  17. int[]countArray=newint[range+1];
  18. for(inti=0;i<array.length;i++){
  19. intvalue=array[i];
  20. if(value<0||value>range){
  21. thrownewException("arrayelementoverflowrange.");
  22. }
  23. countArray[value]+=1;
  24. }
  25. for(inti=1;i<countArray.length;i++){
  26. countArray[i]+=countArray[i-1];
  27. }
  28. int[]temp=newint[array.length];
  29. for(inti=array.length-1;i>=0;i--){
  30. intvalue=array[i];
  31. intposition=countArray[value]-1;
  32. temp[position]=value;
  33. countArray[value]-=1;
  34. }
  35. for(inti=0;i<array.length;i++){
  36. array[i]=temp[i];
  37. }
  38. }
  39. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值