排序算法-计数排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className CountSort * @date 2019/12/9 14:47 * @package com.rao.sort * @Description 计数排序 */ public class CountSort { /** * 计数排序 * @param arr:要排序的数组 * @return */ public static int[] countSort(int[] arr){ int n = arr.length; //先定义两个变量用来存放数组中的最大值和最小值 int min = arr[0]; int max = arr[0]; for (int i = 1; i < n; i++){ if (max < arr[i]){ max = arr[i]; } if (arr[i] < min){ min = arr[i]; } } //定义一个长度为len的数组,这样做是为了防止数组中的最小值为1000,最大值为1010 //这样创建一个大小为10的数组就行了,不用创建大小为1010的数组,浪费空间 int len = max - min + 1; //哪个数字出现了一次,就把它的数字作为下标存起来,假如1006出现了一次,就把temp[1006-1000]加一 int[] temp = new int[len]; for (int i = 0; i < n; i++) { temp[arr[i] - min]++; } int k = 0; //对temp进行遍历,temp[i]的值就是i出现的次数,加入temp[5]=3,说明(5+1000)出现了3次 for (int i = 0; i < len; i++) { for (int j = temp[i]; j > 0; j--){ arr[k] = i + min; k++; } } return arr; } public static void main(String[] args) { int[] arr = {3, 6, 9, 5, 0}; System.out.println(Arrays.toString(arr)); arr = countSort(arr); System.out.println(Arrays.toString(arr)); } }
计数排序是一种适合于最大值和最小值的差值不是不是很大的排序。
基本思想:就是把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数,例如 temp[i] = m, 表示元素 i 一共出现了 m 次。最后再把临时数组统计的数据从小到大汇总起来,此时汇总起来是数据是有序的。