本文共 1159 字,大约阅读时间需要 3 分钟。
计数排序是一种基于比较的排序。它的设计思想是,通过开辟额外的一个空间,将原始数据值转化为键,按顺序取出键,即排序后的序列。
计数排序对待排序序列是有一定要求的,待排序序列必须是一个有确定范围的整数。因为计数排序的思想是将待排序序列的值映射为键,所以,必须是整数。以图为例:
假设给定的初始待排序序列为4 | 3 | 5 | 9 | 3 | 8 | 4 | 5 | 1 |
0 | 1 | 0 | 2 | 2 | 2 | 0 | 1 | 1 |
1 | 3 | 3 | 4 | 4 | 5 | 5 | 8 | 9 |
public class CountingSort { public static void countingSort(int[] arr) { if (arr == null || arr.length == 0) { return; } // 先遍历一遍原始数组,找出最大值 int max = 0, len = arr.length; for (int i = 0; i < len; i++) { if (arr[i] > max) { max = arr[i]; } } // 定义另外一个数组,用来转化原始数组 int[] target = new int[max + 1]; // 第二遍遍历 for (int i = 0; i < len; i++) { int val = arr[i]; target[val] = target[val] + 1; } // 遍历target数组,拿出全部元素 int j = 0; for (int i = 0; i < max + 1; i++) { int val = target[i]; while(val > 0) { arr[j] = i; val--; j++; } } }}
计数排序的时间复杂度和空间复杂度均为 O ( n + k ) O(n + k) O(n+k),其中 k k k是整数的范围。
转载地址:http://kayin.baihongyu.com/