计数排序
来源:互联网 发布:做浮雕的软件 编辑:程序博客网 时间:2024/05/22 04:26
基本介绍
当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。
好处
由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量内存。计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组。
计数排序的要求
- 需要是已知范围的数进行排序。比如数字的范围是1~100
- 创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现个数。
然后要使得C[k]的对应值是原数组中的最大下标+1。也就是说C[k]的值是对应的第C[k]个元素
比如
C[0] // {0,0} 所以C[0]=2 是A对应的前两个个位置都是0
C[1] //{1,1,1} 是对应A的第3到第5个位置应该是1,那么就要把
C[1]变为5了才是下标
然后我们从原数组中一个一个的取出元素,然后算出真实下标。
public class CountSort { public static int MAX=100; public void Sort(int[] A,int[] sort){ int[] count=new int[MAX]; if(A==null||A.length<1){ return; } //统计计数数组 每个元素出现次数 for(int i=0;i<A.length;i++){ count[A[i]]++; } ////统计数组计数,每项都是存的是前N项 for(int k=1;k<MAX;k++){ count[k]+=count[k-1]; } //从最后一个开始 for(int j=A.length-1;j>=0;j--){ int elem=A[j]; //取待排元素 int index=count[elem]-1; //记得减一 sort[index]=elem; count[elem]--;//到下一个了 } } public static void main(String[] args){ CountSort S=new CountSort(); int[] A={1,0,3,1,0,1,1}; int[] sort=new int[A.length]; S.Sort(A, sort); for(int i=0;i<A.length;i++) System.out.println(sort[i]); }}
空间复杂度
O(N)
0 0
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- 计数排序
- mongodb 3.4 配置sharding分片
- 开篇摘要总结
- VM中解决Ubuntu不能全屏的问题
- STM32 延时函数解析
- redirect 和 forward详解
- 计数排序
- mysql 组合索引的顺序问题
- ZYNQ-702裸机之MIO使用
- Single
- ASM认证与口令文件
- Mac自带Python(2.7)升级到3.5
- 解决Eclipse中SVN版本信息不显示的问题
- phpcmsV9静态页面替换动态步骤
- IDEA