排序算法之计数排序

计数排序用于处理元素全为整数或可以用整数形式表示的元素,我们直接看代码与注释:

View Code
 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define N 12
5 #define K 15
6 /** AUTHOR: Mike Feng
7 * 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数;
8 * 计数排序的基本思想就是对每隔一输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到他
9 * 在最终输出数组中的位置上
10 *
11 * 算法需求:
12 * 我们假定输入是个数组a[1..N],另外还需要另个数组:存放排序结果的b[1...n],以及提供临时存储区的c[0...k]
13 **/
14
15 int c[K];
16
17 void print(int *d)
18 {
19 int i;
20 for(i=0;i<N;i++)
21 printf("%d\t",d[i]);
22 printf("\n");
23 }
24
25
26 int *counting_sort(int *a,int *b,int k)
27 {
28 int i;
29 for(i=0;i<k;i++)
30 c[i]=0;
31 for(i=0;i<N;i++)
32 c[a[i]]++;/*c[i]中存储的为a[i]的个数*/
33 for(i=1;i<k;i++)
34 c[i]=c[i]+c[i-1];/*c[i]中存储的是小于等于i的数个数*/
35
36 for(i=0;i<N;i++)
37 {
38 b[c[a[i]]-1]=a[i];/*算法上b的最小下标为1,而数组为0,所以这里需要对b的下标-1来转换*/
39 c[a[i]]--;/*处理具有相等元素的情况*/
40
41 }
42
43
44
45 return b;
46
47 }
48
49 int main(void)
50 {
51 int a[N]={1,4,2,6,3,7,9,13,12,14,5,8};
52 int b[N];
53
54 int *d=NULL;
55
56 print(a);
57 d=counting_sort(a,b,K);
58 print(d);
59
60 return 0;
61 }

运行结果:

posted @ 2012-03-23 09:30  GOD!  阅读(1092)  评论(0编辑  收藏  举报