计数排序--Count Sorting

1.概念
计数排序(Counting sort)是一种非基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中以达到排序的效果。

2.计数排序平均时间复杂度:o(n+k)(平方)、空间复杂度:o(k)。

public class CountSorting {

    public static void main(String[] args) {
        int arr[]= {2,3,4,5,6,2,3,8,5};
        sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }

    }
    public static void sort(int arr[]) {		//第一步找最大最小值
        int max=arr[0];           //最大值
        int min=arr[0];           //最小值
        for(int i=0;i<arr.length;i++) {     //求最大最小值
            if(max<=arr[i]) {
                max=arr[i];
            }
            if(min>=arr[i]) {
                min=arr[i];
            }
        }
        int arr1[]=new int[max-min+1];
        //第二步开辟一个新数组,该数组长度为max-min+1.
        // 表示该数组的下标值范围在想遍历的数组的值都能找到对应的下标范围内,
        // 比如,值为1000,出现2次,哪这个数组的下标范围就0--1000-min+1,arr[1000-min]处为2
        // 出现一次就把该下标对应的值加一。

        for(int j=0;j<arr.length;j++) {  //第三步对计数累加
            arr1[arr[j]-min]++;
            int a=arr[j]-min;
            System.out.println("想遍历数组的"+arr[j]+" "+"在arr1["+a+"]处计"+arr1[arr[j]-min]+"次");

        }
        int num =0;
        for(int i=0;i<arr1.length;i++) {    //第四步根据arr1[]每个值的计算次数对arr[]赋值
            for(int j=arr1[i];j>0;j--) {     //j为arr1[i]处的计数次数
                arr[num++]=i+min;

                int p=i+min;
                int u=num-1;
                System.out.println("这时arr["+u+"]"+"为"+p);
            }
        }
    }


}

```java
想遍历数组的2 在arr1[0]处计1次
想遍历数组的3 在arr1[1]处计1次
想遍历数组的4 在arr1[2]处计1次
想遍历数组的5 在arr1[3]处计1次
想遍历数组的6 在arr1[4]处计1次
想遍历数组的2 在arr1[0]处计2次
想遍历数组的3 在arr1[1]处计2次
想遍历数组的8 在arr1[6]处计1次
想遍历数组的5 在arr1[3]处计2次
这时arr[0]2
这时arr[1]2
这时arr[2]3
这时arr[3]3
这时arr[4]4
这时arr[5]5
这时arr[6]5
这时arr[7]6
这时arr[8]8
2 2 3 3 4 5 5 6 8 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值