计数排序算法介绍
比较排序算法可以通过决策树模型证明,其下线是O(nlgn)。而本文介绍的是时间效率为O(n)的计数排序。所谓排序算法,无非就是把正确的元素放到正确的位置,计数排序就是计算相同key的元素各有多少个,然后根据出现的次数累加而获得最终的位置信息。但是计数排序有两个限制条件,那就是存在一个正整数K,使得数组里面的所有元素的key值都不大于N,且key值都是非负整数。
计数排序算法Java实现
计数排序算法步骤大概有三个步骤:
- 建一个长度为K+1的的数组C,里面的每一个元素初始都置为0(Java里面默认就是0)。
- 遍历待排序的数组,计算其中的每一个元素出现的次数,比如一个key为i的元素出现了3次,那么C[i]=3。
- 累加C数组,获得元素的排位,从0开始遍历C, C[i+1]=C[i]+C[i-1]
- 建一个临时数组T,长度与待排序数组一样。从数组末尾遍历待排序数组,把元素都安排到T里面,直接从C里面就可以得到元素的具体位置, 不过记得每处理过一个元素之后都要把C里面对应位置的计数减1。
具体的排序以及测试代码如下:
- publicclassCountSort{
- publicstaticvoidmain(String[]args)throwsException{
- int[]array={9,8,7,6,5,4,3,2,6,1,0};
- System.out.println("Beforesort:");
- ArrayUtils.printArray(array);
- countSort(array,9);
- System.out.println("Aftersort:");
- ArrayUtils.printArray(array);
- }
- publicstaticvoidcountSort(int[]array,intrange)throwsException{
- if(range<=0){
- thrownewException("rangecan'tbenegativeorzero.");
- }
- if(array.length<=1){
- return;
- }
- int[]countArray=newint[range+1];
- for(inti=0;i<array.length;i++){
- intvalue=array[i];
- if(value<0||value>range){
- thrownewException("arrayelementoverflowrange.");
- }
- countArray[value]+=1;
- }
- for(inti=1;i<countArray.length;i++){
- countArray[i]+=countArray[i-1];
- }
- int[]temp=newint[array.length];
- for(inti=array.length-1;i>=0;i--){
- intvalue=array[i];
- intposition=countArray[value]-1;
- temp[position]=value;
- countArray[value]-=1;
- }
- for(inti=0;i<array.length;i++){
- array[i]=temp[i];
- }
- }
- }
计数排序算法介绍
比较排序算法可以通过决策树模型证明,其下线是O(nlgn)。而本文介绍的是时间效率为O(n)的计数排序。所谓排序算法,无非就是把正确的元素放到正确的位置,计数排序就是计算相同key的元素各有多少个,然后根据出现的次数累加而获得最终的位置信息。但是计数排序有两个限制条件,那就是存在一个正整数K,使得数组里面的所有元素的key值都不大于N,且key值都是非负整数。
计数排序算法Java实现
计数排序算法步骤大概有三个步骤:
- 建一个长度为K+1的的数组C,里面的每一个元素初始都置为0(Java里面默认就是0)。
- 遍历待排序的数组,计算其中的每一个元素出现的次数,比如一个key为i的元素出现了3次,那么C[i]=3。
- 累加C数组,获得元素的排位,从0开始遍历C, C[i+1]=C[i]+C[i-1]
- 建一个临时数组T,长度与待排序数组一样。从数组末尾遍历待排序数组,把元素都安排到T里面,直接从C里面就可以得到元素的具体位置, 不过记得每处理过一个元素之后都要把C里面对应位置的计数减1。
具体的排序以及测试代码如下:
- publicclassCountSort{
- publicstaticvoidmain(String[]args)throwsException{
- int[]array={9,8,7,6,5,4,3,2,6,1,0};
- System.out.println("Beforesort:");
- ArrayUtils.printArray(array);
- countSort(array,9);
- System.out.println("Aftersort:");
- ArrayUtils.printArray(array);
- }
- publicstaticvoidcountSort(int[]array,intrange)throwsException{
- if(range<=0){
- thrownewException("rangecan'tbenegativeorzero.");
- }
- if(array.length<=1){
- return;
- }
- int[]countArray=newint[range+1];
- for(inti=0;i<array.length;i++){
- intvalue=array[i];
- if(value<0||value>range){
- thrownewException("arrayelementoverflowrange.");
- }
- countArray[value]+=1;
- }
- for(inti=1;i<countArray.length;i++){
- countArray[i]+=countArray[i-1];
- }
- int[]temp=newint[array.length];
- for(inti=array.length-1;i>=0;i--){
- intvalue=array[i];
- intposition=countArray[value]-1;
- temp[position]=value;
- countArray[value]-=1;
- }
- for(inti=0;i<array.length;i++){
- array[i]=temp[i];
- }
- }
- }
本文深入探讨了计数排序算法的核心概念及其在Java中的实现方式,详细阐述了算法的时间复杂度和适用场景。通过三个关键步骤,即初始化计数数组、计算元素出现次数并累加获取排位信息,以及将排序后的元素放入临时数组,实现高效的非比较排序。此外,提供了完整的Java代码示例,便于读者理解与实践。
114

被折叠的 条评论
为什么被折叠?



