先写出来几个常见的排序算法:
1插入排序
2选择排序
3冒泡排序
4快速排序
5归并排序
6计数排序
后续会更新堆排序,基数排序,希尔排序。。。。敬请期待。。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
4
5 //插入排序
6 void swap(int *a,int *b)
7 {
8 int temp;
9 temp=*a;
10 *a=*b;
11 *b=temp;
12 }
13 void insertsort(int arry[],int len)
14 {
15 int temp=0;
16 int i=0,j=0;
17 for(i=1;i<len;i++)
18 {
19 temp=arry[i];
20 j=i-1;
21 while(arry[j]>=temp&&j>=0)
22 {
23 arry[j+1]=arry[j];
24 j--;
25 }
26 arry[j+1]=temp;
27 }
28 }
29 //选择排序
30
31 void slectsort(int arry[],int len)
32 {
33 int i=0,j=0;
34 int temp;
35 int min=0;
36 for(i=0;i<len;i++)
37 {
38 min=i;
39 for(j=i+1;j<len;j++)
40 {
41 if(arry[min]>arry[j])
42 {
43 min=j;
44 }
45 }
46 if(min!=i)
47 {
48 temp=arry[i];
49 arry[i]=arry[min];
50 arry[min]=temp;
51 }
52 }
53 }
54
55 //冒泡排序
56 void bubblesort(int arry[],int len)
57 {
58 int i=0,j=0;
59 int flag=1;
60 for(i=0;i<len&&flag;i++)
61 {
62 flag=0;
63 for(j=len-1;j>i;j--)
64 {
65 if(arry[j]<arry[j-1])
66 {
67 swap(&arry[j],&arry[j-1]);
68 flag=1;
69 }
70 }
71 }
72 }
73
74 //快速排序
75 int partion(int arry[],int begin,int end)
76 {
77 int i=0;
78 int loc=begin;
79 int mid=arry[begin];
80 for(i=begin+1;i<=end;i++)
81 {
82 if(mid>=arry[i])
83 {
84 loc++;
85 swap(&arry[loc],&arry[i]);
86 }
87 }
88 swap(&arry[loc],&arry[begin]);
89 return loc;
90 }
91 void quiksort(int arry[],int begin,int end)
92 {
93 int q;
94 if(begin<end)
95 {
96 q=partion(arry,begin,end);
97 quiksort(arry,begin,q-1);
98 quiksort(arry,q+1,end);
99 }
100 }
101 //归并排序 元素下标
102 void merge(int arry[],int begin,int mid,int end)
103 {
104 int a[1000]={0};
105 int i=0,j=0,k=0;
106 for(i=begin,j=mid+1,k=0;i<=mid&&j<=end;k++)
107 {
108 if(arry[i]>arry[j])
109 {
110 a[k]=arry[j];
111 j++;
112 }
113 else
114 {
115 a[k]=arry[i];
116 i++;
117 }
118 }
119 if(i>mid)
120 {
121 for(;j<=end;j++,k++)
122 {
123 a[k]=arry[j];
124 }
125 }
126 if(j>end)
127 {
128 for(;i<=mid;i++,k++)
129 {
130 a[k]=arry[i];
131 }
132 }
133 for(i=begin,k=0;i<=end;i++,k++)
134 {
135 arry[i]=a[k];
136 }
137 }
138 void mergesort(int arry[],int begin,int end)
139 {
140 int mid=(begin+end)/2;
141 if(begin<end)
142 {
143 mergesort(arry,begin,mid);
144 mergesort(arry,mid+1,end);
145 merge(arry,begin,mid,end);
146 }
147 }
148 //计数排序 前提输入的数据都在0--k之间
149 void countsort(int arry[],int len,int k)
150 {
151 int count[1000]={0};
152 int i=0;
153 int b[1000]={0};
154 for(i=0;i<len;i++)
155 {
156 count[arry[i]]=count[arry[i]]+1;
157 }
158 for(i=1;i<k;i++)
159 {
160 count[i]=count[i]+count[i-1];
161 }
162 for(i=len-1;i>=0;i--)
163 {
164 b[count[arry[i]]-1]=arry[i];
165 count[arry[i]]--;
166 }
167 for(i=0;i<len;i++)
168 {
169 arry[i]=b[i];
170 }
171
172
173 }
174
175
176 //测试
177 void print(int arry[])
178 {
179 int i=0;
180 for(i=0;i<100;i++)
181 {
182 printf("%d ",arry[i]);
183 if((i+1)%10==0)
184 printf("\n");
185 }
186 }
187 void main()
188 {
189 int i;
190 int a[100]={0};
191 srand(time(NULL));
192 for(i=0;i<100;i++)
193 {
194 a[i]=rand()%1001;
195 }
196 print(a);
197 // insertsort(a,100);
198 // slectsort(a,100);
199 // bubblesort(a,100);
200 // quiksort(a,0,99);
201 // mergesort(a,0,99);
202 countsort(a,100,1000);
203 printf("排序后的数组:\n");
204 print(a);
205 }