学了很多的排序,基数排序,堆排序,希尔排序,选择排序,归并排序,快速排序,冒泡排序.....等等,尽管网上好文,如堆山之牛毛,但是还是没有自己写,来的亲切,因而唠叨数语,为以后只闲暇,积累一些看资,也仅以自己娱乐罢了,大神等,尽可鄙视之,我等小子亦是荣幸万分!
大学,我们接触的第一种排序,便是冒泡排序,那么冒泡排序的原理是什么勒? 哎,太基础啦,挫
比如一组数字
1 /*归并排序递归版
2 Coder @ Gxjun
3 2014/3/30/16:42
4 */
5 #include<stdio.h>
6 #include<string.h>
7 #include<stdlib.h>
8 void merge(int A[],int lowc ,int high,int tol_len)
9 {
10 int *cc;
11 cc=(int *)malloc(sizeof(int)*(1+tol_len)); // <==> int cc[tol_len];
12 int i,j,k=0;
13 i=lowc ;
14 j=high;
15 while(i<high&&j<tol_len)
16 {
17 if(A[i]>A[j]) //以升序即从小到大的顺序排列
18 {
19 cc[k++]=A[j];
20 j++;
21 }
22 else
23 {
24 cc[k++]=A[i];
25 i++;
26 }
27 }
28 //有可能不是一起放完,因此还需要对剩余的元素放到cc中
29 for( ; i<high ; i++)
30 cc[k++]=A[i];
31 for( ; j<tol_len ; j++)
32 cc[k++]=A[j];
33 //然后将排好序的这个新子段,放回去
34 k=0;
35 for(i=lowc ;i<tol_len ;i++)
36 A[i]=cc[k++];
37 free(cc);
38 }
39 void merge_sort(int A[],int st,int en)
40 {
41 if(st<en-1) //两者至少相隔一个元素
42 {
43 int mid=st+(en-st)/2;
44 merge_sort(A,st,mid);
45 merge_sort(A,mid,en);
46 merge(A,st,mid,en);
47 }
48 }
49 int array[12];
50 int main()
51 {
52 int n,i;
53 while(scanf("%d",&n)!=EOF)
54 {
55 for(i=0;i<n;i++)
56 scanf("%d",array+i);
57 merge_sort(array,0,n);
58 for(i=0;i<n;i++)
59 printf("%3d",array[i]);
60 putchar(10);
61 }
62
63 return 0;
64 }
1 /*归并排序非递归版
2 Coder @ Gxjun
3 2014/3/30/16:22
4 */
5 #include<stdio.h>
6 #include<string.h>
7 #include<stdlib.h>
8 void merge(int A[],int lowc ,int high,int tol_len)
9 {
10 int *cc;
11 cc=(int *)malloc(sizeof(int)*(1+tol_len)); // <==> int cc[tol_len];
12 int i,j,k=0;
13 i=lowc ;
14 j=high;
15 while(i<high&&j<tol_len)
16 {
17 if(A[i]>A[j]) //以升序即从小到大的顺序排列
18 {
19 cc[k++]=A[j];
20 j++;
21 }
22 else
23 {
24 cc[k++]=A[i];
25 i++;
26 }
27 }
28 //有可能不是一起放完,因此还需要对剩余的元素放到cc中
29 for( ; i<high ; i++)
30 cc[k++]=A[i];
31 for( ; j<tol_len ; j++)
32 cc[k++]=A[j];
33 //然后将排好序的这个新子段,放回去
34 k=0;
35 for(i=lowc ;i<tol_len ;i++)
36 A[i]=cc[k++];
37
38 free(cc);
39 }
40 void merge_sort(int A[],int st,int en)
41 {
42 int i,s,t;
43 t=1;
44 while(t<=en-st)
45 {
46 s=t; //每一个子段的长度
47 t=2*t; //合并的长度
48 i=st;
49 while(i+t<=en-st)
50 {
51 merge(A,i,i+s,i+t);
52 i+=t;
53 }
54 }
55 if(s<en-st)
56 merge(A,st,s+st,en);
57 }
58 int array[12];
59 int main()
60 {
61 int n,i;
62 while(scanf("%d",&n)!=EOF)
63 {
64 for(i=0;i<n;i++)
65 scanf("%d",array+i);
66 merge_sort(array,0,n);
67 for(i=0;i<n;i++)
68 printf("%3d",array[i]);
69 putchar(10);
70 }
71
72 return 0;
73 }
1 /*
2 Quck_sort();
3 Coder @Gxjun
4 2014/3/30
5 */
6 #include<stdio.h>
7 #include<string.h>
8 #include<stdlib.h>
9 #include<time.h>
10 void swap(int *a ,int *b)
11 {
12 if(*a!=*b)
13 {
14 *a^=*b;
15 *b^=*a;
16 *a^=*b;
17 }
18 }
19 int divepart(int A[], int left,int right)
20 {
21
22 /*srand(time(NULL));
23 int key=A[left+rand()%(right-left)];*/
24 int key=A[left];
25 while(left<right)
26 {
27 //还是以升序为列,即从小到大
28 while(key<A[right])
29 right--;
30 // swap(&A[left],&A[right]);
31 while(key>A[left])
32 left++;
33 swap(&A[right],&A[left]);
34 }
35 return left;
36 }
37 void K_sort(int A[],int lowc,int high )
38 {
39 if(lowc<high)
40 {
41 int mid=divepart(A,lowc,high);
42 K_sort(A,lowc,mid);
43 K_sort(A,mid+1,high);
44 }
45 }
46 int array[12];
47 int main()
48 {
49 int n,i;
50 while(scanf("%d",&n)!=EOF)
51 {
52 for(i=0;i<n;i++)
53 scanf("%d",array+i);
54 K_sort(array,0,n-1);
55 for(i=0;i<n;i++)
56 printf("%3d",array[i]);
57 putchar(10);
58 }
59 return 0;
60 }
编程是一种快乐,享受代码带给我的乐趣!!!