计数排序

 1 //计数排序的思想是这样的,如果小于等于a的数字有n个,那么就把a放在第n+1个位置,从而达到排序的目的

 2 //关键是怎么统计小于等于a的数字有多少个,

 3 /*

 4 可以采用这样一个办法,将数组元素的值映射为下标,统计该下标出现了多少次,然后再统计比该下标小或者等的下标出现了多少次,

 5 从而就统计出了小于等于a的数字有多少个

 6 */

 7 

 8 //计数排序的时间复杂度为O(n), 但是缺点为数据有多大,数据就要开多大。

 9 #include <stdio.h>

10 #include <string.h>

11 const int N = 1000;

12 int a[N],b[N];

13 int c[1000000];

14 

15 

16 void countingSort(int n, int m)

17 {

18     int i;

19     for(i=0; i<=m; ++i) c[i] = 0;

20     for(i=0; i<n; ++i) c[a[i]] ++;//将a[i] 映射为下标,统计该下标出现了多少次

21     for(i=1; i<=m; ++i) c[i] += c[i-1];//统计比该小或者等的下标出现了多少次

22     //for(i=n-1; i>=0; --i) //稳定

23     for(i=0; i<n; ++i)//不稳定

24     b[--c[a[i]]] = a[i];//c[]记录了小于等于a[i]的数字有多少个,直接将a[i]放在相应的位置上去

25 }

26 int main()

27 {

28     int n,m,i;

29     scanf("%d",&n);

30     m = -1;

31     for(i=0; i<n; ++i)

32     {

33         scanf("%d",&a[i]);

34         m = a[i] > m ? a[i] : m;

35     }    

36     countingSort(n, m);

37     for(i=0; i<n; ++i)

38         printf("%d ",b[i]);

39     

40     return 0;

41 }

 

你可能感兴趣的:(排序)