计数排序

来源:互联网 发布:做浮雕的软件 编辑:程序博客网 时间: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
原创粉丝点击