一、计数排序
排序特点:
输入元素大于等于零,当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 O(n + k)。计
数排序不是比较排 序,排序的速度快于任何比较排序算法。适合数据范围小的数组。
核心思想:
找出数组中最大值, 创建hash数组,数组长度为最大值max+1,以数组下标表示排序元素的值,hash数组元素的值表示排序元素出现的次数,进行统计出现的次数,最后进行回填。
图例:
最后根据元素出现的次数进行回填到原数组中,代码如下
//计数排序
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--;
}
}
}
}
本题除了使用计数排序外,还可以使用双指针、三路快排的方法,解答方法将会持续发布博客。