开发中常见的算法汇总之-计数排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cpongo4/article/details/89333892
#### 计数排序 - 核心思想 - 建立一个范围在待排序数列中最大元素值大小的数组,针对待排序数列中的每个元素在建立的数组中按照元素值作为数组的索引依次对号入座,相同元素则对其进行累加计数,而后遍历数组按索引取出即排序完成 - 最核心思想是通过空间换时间,排序元素值越大所需要耗费空间越大 - 特性 - 待排序的元素在某一个范围[min,max]之间(必须是整数且有范围限制) - 最小和最大之间的范围相差越大时间复杂度就越高 - 需要借助额外的空间来辅助排序,属于非原地排序 - 不需要通过对元素的比较来进行排序 - 步骤 - 从待排数列中找出最大元素的值 - 建立一个最大元素值大小的数组C - 遍历待排数列中的值并在其值对应索引位置的数组C中计数1,相同元素则在对应的索引位置进行累加计数+1 - 后续遍历数组C中将计数大于0的索引值取出按照顺序替换原待排序数列中的值完成排序 - 图解 006tNc79ly1g1t9iw7nf9g30sg0t04li.gif - 示例 ```java package com.lyd.algorithm.sort; import com.lyd.utils.RandomUtils; import lombok.extern.slf4j.Slf4j; /** * 描述:计数排序 *

* - 从待排数列中找出最大元素的值 * - 建立一个最大元素值大小的数组C * - 遍历待排数列中的值并在其值对应索引位置的数组C中计数1,相同元素则在对应的索引位置进行累加计数+1 * - 后续遍历数组C中将计数大于0的索引值取出按照顺序替换原待排序数列中的值完成排序 *

* * @author lyd Date 2019/4/6 ProjectName:datastructure-algo Version: 1.0 */ @Slf4j public class CountingSort { /** * 计数排序 * * @param data 待排数据集 * @return 排序后数据集 */ static int[] countingSort(int[] data) { if (null == data || data.length < 1) { return data; } //找出待排序列中最大元素值确定额外数组的范围 int max = data[0]; for (int i = 1; i < data.length; i++) { if (data[i] > max) { max = data[i]; } } log.info("countingSort max:{}", max); //建立一个max+1大小的数组 int[] arrays = new int[max + 1]; //将待排序列元素值对号入座计数1(元素值即为数组下标索引),相同元素计数累加1 for (int i = 0; i < data.length; i++) { int index = data[i]; arrays[index] = ++arrays[index]; } log.info("countingSort arrays:{}", arrays); //遍历arrays数组,将计数值大于0的索引值替换写原待排数列中 int cursor = 0; for (int i = 0; i < arrays.length; i++) { int count = arrays[i]; //计数值大于1表示有相同元素 while (count > 0) { data[cursor++] = i; count--; } } return data; } public static void main(String[] args) { // int[] sorts = new int[]{13, 15, 13, 5, 6, 11, 16, 20, 17, 12, 5, 6, 11, 16, 20, 17}; int[] sorts = RandomUtils.intArrays(15,20); int[] result = countingSort(sorts); log.info("sorts:{}", result);//[5, 5, 6, 6, 11, 11, 12, 13, 13, 15, 16, 16, 17, 17, 20, 20] } } ```

猜你喜欢

转载自blog.csdn.net/cpongo4/article/details/89333892