计数排序【java实现】

一、计数排序

 排序特点:

输入元素大于等于零,当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 O(n + k)。计

数排序不是比较排 序,排序的速度快于任何比较排序算法。适合数据范围小的数组。

核心思想:

找出数组中最大值, 创建hash数组,数组长度为最大值max+1,以数组下标表示排序元素的值,hash数组元素的值表示排序元素出现的次数,进行统计出现的次数,最后进行回填。

图例: 

计数排序【java实现】_第1张图片 最后根据元素出现的次数进行回填到原数组中,代码如下

//计数排序
import java.util.Arrays;
/**
 * 核心思想:
 * 找出数组中最大值
 * 创建hash数组进行统计出现的次数
 * 在进行填充
 */
public class CountSort {

    //获取数组中最大元素
    public int getMax(int[] arr){
        return Arrays.stream(arr).max().getAsInt();
    }

    public void sort(int[] arr){
        int max = getMax(arr);
        int[] hash  = new int[max+1];
        //统计初始化hash
        for (int i = 0; i < arr.length ; i++) {
            hash[arr[i]]++;
        }
        //回填
        int index = 0;
        for (int i = 0; i < hash.length ; i++) {
            int count = hash[i];
            while (count-->0){
                arr[index++] = i;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {1,5,5,3,6,9,4,9};
        CountSort countSort = new CountSort();
        countSort.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

二、实练计数排序

使用计数排序可以解决力扣75颜色分类问题:

75. 颜色分类

题目描述:

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

解答: 

class Solution {
    //计数排序
        public void sortColors(int[] nums) {
        if (nums == null || nums.length < 2) {
            return;
        }
        //统计
        int[] arr = new int[3];
        for (int i = 0; i < nums.length; i++) {
            arr[nums[i]]++;
        }
        //回填
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            int count = arr[i];
            while (count > 0) {
                nums[index++] = i;
                count--;
            }

        }
    }
}

 本题除了使用计数排序外,还可以使用双指针、三路快排的方法,解答方法将会持续发布博客。

你可能感兴趣的:(数据结构,数据结构,排序算法)