【算法面试宝典】十大经典排序算法 - 计数排序

1 解题思路

        计数排序是一种非比较排序,是典型的用空间换取时间的排序算法,时间复杂度只有 O(n)。

计数排序的思路非常简单:重新创建一个数据,把要排序的数组中的值作为新的数组的索引,新的数组的值是元素出现的次数,然后遍历新的数组,依次把大于0的元素的下标取出赋值到另一个数组,即为排序后的数组。计数排序的步骤:

1)找出原数组 nums 中的最大值 max 。

2)定义一个新的数组 int[] countNums = new int[max+1] 。

3)对新的数组 countNums 赋值,countNums 的索引是数组 nums 的元素值,countNums 的值是索引值在nums中出现的次数。

4)定义nums的索引值 index=0 , 遍历数组 countNums ,依次把值大于0的索引值放入数组nums中。遍历的时候countNums的值每次减 1 ,直到为0为止。

计数排序的过程如下图所示:

2 编码实现

public static void countSort(int[] nums){
    //找出数组中的最大值
    int max = -1;
    for(int i=0;i<nums.length;i++){
        if(max<nums[i]){
            max = nums[i];
        }
    }

    //定义新数组,并赋值
    int[] countNums = new int[max+1];
    for(int i=0;i<nums.length;i++){
        countNums[nums[i]]++;
    }

    //把元素赋值到目标数组中,完成排序
    int index = 0;  //nums数组的索引
    for(int i=0;i<countNums.length;i++){
        while(countNums[i]-->0){
            nums[index++] = i;
        }
    }
}

3 时间复杂度和空间复杂度

        技术排序是线性时间,所以时间复杂度 S(n) = O(n)。计数排序额外使用了元素最大值的空间,所以空间复杂度 S(n) = O(n)。

        技术排序需要满足两个条件:第一,数组的值相对比较集中;第二,排序的值必须是整数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值