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

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)。

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

猜你喜欢

转载自blog.csdn.net/u010482601/article/details/121464548