排序算法之基数排序

基数排序思想很简单,直接上代码:

View Code
  1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #define N 16 /*字符串个数*/
6 #define M 3 /*每个字符串的字符个数*/
7 /** AUTHOR: Mike Feng
8 * 基数排序:对元素每一位进行排序
9 */
10
11 /*打印*/
12 void print(char ** a)
13 {
14 int i;
15 for(i=0;i<N;i++)
16 printf("%s\t",a[i]);
17 printf("\n");
18 }
19
20 /*只是交换指针,因为a对应的字符串在只读区,不能更改*/
21 char **exchange(char **a,int i,int j)
22 {
23 char *tmp=NULL;
24
25 tmp=a[i];
26 a[i]=a[j];
27 a[j]=tmp;
28
29 return a;
30 }
31 /*比较该位前面各位的字符是否相等*/
32 int cmpa(char **a,int d,int i1)
33 {
34 int i;
35 for(i=0;i<d;i++)
36 {
37 if(a[i1][i]!=a[i1+1][i])
38 return 0;
39 }
40 return 1;
41 }
42
43 int partition(char **a,int d,int p,int r)
44 {
45 int i1,i2;
46 /*下面的注释部分意义:对于d==0的情况合适,但由于对于d>0的情况a中的元素已经有一定的顺序了,所以不能再进行随机选取比较点*/
47 // int q=rand()%(r-p+1)+p;
48 // a=exchange(a,r,q);
49 int i=p,j=r;
50 char t=a[r][d];
51 if(d==0){
52 while(i<j)
53 {
54 while(a[i][d]<t && i<j)i++;
55 while(a[j][d]>=t && i<j)j--;/*注意,这里因为是取的最后一个元素作为分界点,那么这里要跳过自身所以为">="*/
56
57 a=exchange(a,i,j);
58 i++;
59 }
60 if(a[j][d]>t)
61 a=exchange(a,j,r);
62 }
63 else/*d>0,即d==0的位已经排好顺序*/
64 {
65 i1=p;
66 i2=p;
67 while(i1<r){
68 while(i1<r && !cmpa(a,d,i1))i1++;
69 i2=i1;/*i2为前一位相等第一个元素*/
70
71 while(i2<r && cmpa(a,d,i2))i2++;
72
73 t=a[i2][d];
74 j=i2;
75
76 while(i1<j)
77 {
78 while(a[i1][d]<t && i1<j )i1++;
79 while(a[j][d]>=t && i1<j) j--;
80 a=exchange(a,i1,j);
81 i1++;
82 }
83 a=exchange(a,j,i2);
84 i1=i2+1;
85 }
86 }
87 return j;
88
89 }
90
91 /*每一位应用快排*/
92 void quick_sort(char **a,int i,int p,int r)
93 {
94 if(p<r){
95 int q=partition(a,i,p,r);/*传入的参数r可用,即0--N-1*/
96 quick_sort(a,i,p,q-1);
97 quick_sort(a,i,q+1,r);/*下标要统一*/
98 }
99 }
100 /*基数排序*/
101 char** radix_sort(char **a,int d)
102 {
103 int i;
104 for(i=0;i<3;i++)
105 quick_sort(a,i,0,N-1);
106 return a;
107 }
108
109
110 int main(void)
111 {
112 char *a[]={"COW","DOG","SEA","RUG","ROW","MOB","BOX","TAB","BAR","EAR","TAR","DIG","BIG","TEA","NOW","FOX"};
113 printf("%s\n","排序前:");
114 print(a);
115 radix_sort(a,3);
116 printf("%s\n","排序后:");
117 print(a);
118
119 return 0;
120 }

运行结果:

posted @ 2012-03-23 16:27  GOD!  阅读(855)  评论(6编辑  收藏  举报