经典非比较排序—计数排序的Java实现方式

     

目录

1.具体思路:

2.代码实现:

3.代码分析

4.示例测试:

测试源码:

测试结果:


     计数排序,又被称为鸽巢原理,属于桶排序的一种,其本质是通过哈希映射思想,设定计数数组输入以及输出,实现非比较排序。

1.具体思路:

     首先遍历待排序数组获取数组的最大值以及最小值,以此获取极差(两最值之差),根据极差大小设定计数数组,然后继续遍历待排序数组,根据映射关系在计数数组中计数,最后同时遍历计数数组与待排序数组,根据计数数组的计数内容将数据取出输出至待排序的原数组中。

2.代码实现:

     该代码中计数数组的映射关系为:计数数组下标为i处的存储空间为大小为i+min(待排序数组中的最小值)的值进行计数读者也可使用其他合理的映射关系。

public class CountSort {
    public static void countSort(int[]array){
        //遍历数组求最大值与最小值,以此获得极差创建计数数组
        //默认最大值与最小值均为起始元素
        int max=array[0];
        int min=array[0];
        //遍历数组获取最大值与最小值
        for(int i=1;i<array.length;i++){
            if(array[i]>max){
                max=array[i];
            }
            if(array[i]<min){
                min=array[i];
            }
        }
        //根据极差大小创建计数数组
        int[]count=new int[max-min+1];
        //遍历数组,根据映射关系开始计数
        for(int i=0;i< array.length;i++){
            //根据映射关系算出该元素在计数数组中的下标
            int index=array[i]-min;
            //对应位置计数加1
            count[index]++;
        }
        //计数完毕,开始遍历计数数组,输出到原数组中
        //设定原数组下标
        int index=0;
        for(int i=0;i< count.length;i++){
            //值相同的元素可能有多个,即计数数组中可能存在计数不为1的元素,需要多次取出
            while(count[i]>0){
                //根据映射关系取出元素
                int elem=i+min;
                //输出至原数组中
                array[index]=elem;
                //原数组下标移动
                index++;
                //计数数组对应计数减1
                count[i]--;
            }
        }
    }
}

3.代码分析

(1)时间复杂度:O(max(n,极差))(即n与待排序数组极差中的较大值);

(2)空间复杂度:O(极差);

(3)稳定性:稳定。

4.示例测试:

测试源码:


public class Test {
    public static void main(String[] args) {
        int[]array={2,4,1,3,6,8,5,7};
        System.out.println("排序前数组"+Arrays.toString(array));
        CountSort.countSort(array);
        System.out.println("排序后数组"+Arrays.toString(array));
    }
}

测试结果:

以上便是通过java实现计数排序的全部内容,如有不当,敬请斧正! 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值