首页 > 代码库 > 数据结构中常见的排序算法纯C语言实现
数据结构中常见的排序算法纯C语言实现
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 /*
5 排序算法集合
6 排序算法一般分成非比较排序和比较排序
7 这里的比较非比较不是指是否有数字的比较,而是是否直接对比较的数字操作
8 */
9
10 //显示数组
11 void show(int arr[],int size);
12 /*=====非比较排序=======*/
13 //计数排序
14 void counting_sort(int arr[],int size);
15 //基数排序
16 void radix_sort(int arr[],int size);
17 //桶排序
18 void bucket_sort(int arr[],int size);
19 /*======比较排序=======*/
20 //冒泡排序
21 void bubble_sort(int arr[],int size);
22 //插入排序
23 void insertion_sort(int arr[],int size);
24 //选择排序
25 void selection_sort(int arr[],int size);
26 //归并排序
27 void merge_sort(int arr[],int size);
28 //快速排序
29 void quick_sort(int arr[],int size);
30 //堆排序
31 void heap_sort(int arr[],int size);
32 //希尔排序
33 void shell_sort(int arr[],int size);
34 //void _sort(int arr[],int size);
35
36 //获取数组中的最大的元素
37 int maxof(int arr[],int size);
38
39 //交换数组中的第i与第j个元素
40 void swap(int arr[],int i,int j);
41
42 /*==========主函数===========*/
43 int main(){
44 int a[]={1,3,5,6,4,2,8,9,7,0};
45 int size=sizeof(a)/sizeof(int);
46 merge_sort(a,size);
47 show(a,size);
48 return 0;
49 }
50
51 /*=====非比较排序======
52 特点:少数数据有优势,占用空间,不适合给大量的数据进行排序
53 下面三种的时间复杂度都是O(n)
54 1.比较排序
55 通过记录比各个元素小的元素的个数来进行排序,
56 因为比较的作用只是用于计数,所以不属于比较排序
57 2.基数排序
58 读音跟计数排序差不多,但是原理是不一样的
59 算法是通过给从各位开始的每个数位进行排序,
60 来达到依次有序的目的
61 3.桶排序
62 通过将给定的数列的每个元素放到对应的位置来进行排序
63 理论上排序效率优于任何的比较排序算法,
64 但是由于需要开辟的储存空间过大,所以并不是很实用
65 */
66 //自创的排序方法,实际上是比较排序的另一种实现
67 //自创的排序方法,非比较排序,时间复杂度为n^n
68 void my_sort(int arr[],int size){//arr[]是源数组,size是数组的大小
69 int temp[size],count[size];//count数组用于计数
70 int i,j;//i,j为循环变量
71 memset(count,0,sizeof(int)*size);//初始化count数组,其值为0
72 for(i=0;i<size;i++){
73 for(j=0;j<size;j++)
74 //如果当前遍历的数比指定的数小,指定的位置权加1
75 if(arr[j]<arr[i]) count[i]++;
76 }
77 for(i=0;i<size;i++)
78 temp[count[i]]=arr[i];
79 for(i=0;i<size;i++)
80 arr[i]=temp[i];
81 }
82
83 //计数排序
84 void counting_sort(int arr[],int size){
85 int max=maxof(arr,size);
86 int count[max+1],temp[size];
87 memset(count,0,sizeof(int)*(max+1));
88 // memset(temp,0,sizeof(int)*(size));
89 int i;
90 for(i=0;i<size;i++)
91 count[arr[i]]++;
92 for(i=1;i<=max;i++)
93 count[i]+=count[i-1];
94 for(i=size-1;i>=0;i--)
95 temp[--count[arr[i]]]=arr[i];
96 for(i=0;i<size;i++)
97 arr[i]=temp[i];
98 }
99
100 //基数排序
101 void radix_sort(int arr[],int size){
102 int i,index,lsd=1,max=maxof(arr,size);
103 int count[10],temp[size];
104 while(max/lsd>0){
105 memset(count,0,sizeof(int)*10);
106 for(i=0;i<size;i++){
107 index=arr[i]/lsd%10;
108 count[index]++;
109 }
110 for(i=1;i<10;i++)
111 count[i]+=count[i-1];
112 for(i=size-1;i>=0;i--){
113 index=arr[i]/lsd%10;
114 index=--count[index];
115 temp[index]=arr[i];
116 }
117 for(i=0;i<10;i++)
118 arr[i]=temp[i];
119 lsd*=10;//进位
120 }
121 }
122
123 //桶排序
124 void bucket_sort(int arr[],int size){
125 int max=maxof(arr,size);
126 int *bucket=(int *)malloc(sizeof(int)*(max+1));//创建一个可以存入数组中所有数字的"大桶"
127 memset(bucket,0,sizeof(int)*(max+1));//初始化大桶
128 int i,j;
129 for(i=0;i<size;i++) bucket[arr[i]]++;//将数组中的数字当成下标进行储存
130 for(i=j=0;i<=max;i++)
131 while(bucket[i]--) arr[j++]=i; //将有权重的桶的下标存入原数组
132 }
133
134 /*======比较排序=======
135 1.冒泡排序
136 比较前后元素的大小,达到将最大的元素浮到最后的目的.稳定排序
137 2.选择排序
138 每次都将获得的当前状态的最小的元素放置到最前面,不稳定排序
139 3.插入排序
140 分组,将分组中的最小的元素放置逐元素移动到前面,直到遇到比它小的元素,稳定排序
141 4.归并排序
142 利用分治思想,稳定排序
143 5.堆排序
144 利用大根堆排序,不稳定排序
145 6.快速排序
146 每次找准一个数的位置,利用分治依次把所有的值的位置都确定,不稳定排序
147 7.希尔排序
148 可以看成插入排序的一种改进,不过速度很快,不稳定排序
149 */
150
151 //冒泡排序
152 void bubble_sort(int arr[],int size){
153 int i,j,flag,tmp;
154 for(i=1;i<size;i++){
155 flag=1;
156 for(j=0;j<size-1;j++){
157 if(arr[j]>arr[j+1]){//交换arr[j]与arr[j+1]
158 tmp=arr[j];
159 arr[j]=arr[j+1];
160 arr[j+1]=tmp;
161 flag=0;//匹配标志位
162 }
163 }
164 if(flag) return;//判断是否已经完成排序
165 }
166 }
167
168 //选择排序
169 void selection_sort(int arr[],int size){
170 int i,j,min,tmp;
171 for(i=0;i<size-1;i++){
172 min=i;
173 for(j=i+1;j<size;j++){
174 if(arr[j]<arr[min]) min=j;
175 }
176 if(min!=i){//交换min和i元素
177 tmp=arr[min];
178 arr[min]=arr[i];
179 arr[i]=tmp;
180 }
181 }
182 }
183
184 //插入排序
185 void insertion_sort(int arr[],int size){
186 int i,j,temp;
187 for(i=1;i<size;i++){
188 temp=arr[i];
189 for(j=i-1;j>=0&&arr[j]>temp;j--){//将a[i]向前推进
190 arr[j+1]=arr[j];
191 }
192 arr[j+1]=temp;
193 }
194 }
195
196 //归并排序,算法的思想值得借鉴
197 void merge_sort(int arr[],int size){
198 int step,left_min,left_max,right_min,right_max,next;
199 int *tmp=(int *)malloc(sizeof(int)*size);
200 if(tmp==NULL){
201 fputs("Something is wrong!\n",stderr);
202 abort();
203 }
204 for(step=1;step<size;step*=2){
205 for(left_min=0;left_min<size-1;left_min=right_max){
206 right_min=left_max=left_min+step;
207 right_max=left_max+step;
208 if(right_max>size) right_max=size;
209 next=0;
210 while(left_min<left_max&&right_min<right_max)//向缓存数组中存放数字
211 tmp[next++]=arr[left_min]<arr[right_min]?arr[left_min++]:arr[right_min++];
212 while(left_min<left_max) tmp[next++]=arr[left_min++];
213 while(right_min<right_max) tmp[next++]=arr[right_min++];
214 while(next>0) arr[--right_min]=tmp[--next];
215 }
216 }
217 free(tmp);
218 }
219
220 //堆排序
221 void heap_sort(int arr[],int size){
222 int i;
223 for(i=(size-1)/2;i>=0;i--){
224 maxHeapify(arr,i,size);
225 }
226 for(i=size-1;i>0;i--){
227 swap(arr,0,i);
228 maxHeapify(arr,0,i);
229 }
230
231 }
232
233 //====堆调整
234 void maxHeapify(int arr[],int i,int size){
235 int left=i*2+1;//左子树
236 int right=i*2+2;//右子树
237 int large=i;
238 //选择左右子树中值较大的一个
239 if(left<size&&arr[left]>arr[large]) large=left;
240 if(right<size&&arr[right]>arr[large]) large=right;
241 if(i!=large){
242 swap(arr,i,large);
243 maxHeapify(arr,large,size);
244 }
245 }
246
247
248 //快速排序,这里我们使用非递归模式
249 void quick_sort(int arr[],int size){
250 int left=0,right=size,top=-1;
251 int *stack=(int*)malloc(sizeof(int)*size*2);//指定stack空间的大小
252 stack[++top]=left;
253 stack[++top]=right;
254 while(~top){//非空栈(即top!=-1)时循环
255 right=stack[top--];
256 left=stack[top--];
257 int i=left;
258 int j=right;
259 int key=arr[left];
260 while(i<j){
261 while(i<j&&arr[j]>=key) j--;
262 arr[i]=arr[j];
263 while(i<j&&arr[i]<=key) i++;
264 arr[j]=arr[i];
265 }
266 arr[i]=key;
267 if(left<i-1){
268 stack[++top]=left;
269 stack[++top]=i-1;
270 }
271 if(i+1<right){
272 stack[++top]=i+1;
273 stack[++top]=right;
274 }
275 }
276 }
277
278 //希尔排序
279 void shell_sort(int arr[],int size){
280 int i,j,k,d,temp;
281 for(d=size/2;d>0;d/=2){
282 for(j=d;j<size;j++){
283 temp=arr[j];
284 for(k=j-d;k>=0&&arr[k]>temp;k-=d)//向前推进
285 arr[k+d]=arr[k];
286 arr[k+d]=temp;
287 }
288 }
289 }
290
291 //用于显示数组
292 void show(int a[],int size){
293 int i;
294 for(i=1;i<=size;i++){
295 printf("%d\t",a[i-1]);
296 if(i%10==0) puts("");
297 }
298 if((i-1)%10) puts("");
299 }
300
301 //获得数组中的最大值
302 int maxof(int arr[],int size){
303 if(size<=0) return -1;
304 int max=arr[size-1];
305 while(--size) if(max<arr[size]) max=arr[size];
306 return max;
307 }
308
309 //交换arr数组中的第i个和第j个元素
310 void swap(int arr[],int i,int j){
311 int tmp=arr[i];
312 arr[i]=arr[j];
313 arr[j]=tmp;
314 }
数据结构中常见的排序算法纯C语言实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。