算法导论第二章

插入排序源码:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 void insert_sort(int a[])
 7 {
 8     for(int j=1;j<10;j++)
 9     {
10         int key=a[j];
11         int i=j-1;
12         while(i>=0 && a[i]>key)
13         {
14             a[i+1]=a[i];
15             i--;
16         }
17         a[i+1]=key;
18     }
19 }
20 
21 int main()
22 {
23     int a[10];
24     int i;
25     for(i=0;i<10;i++)
26         scanf("%d",&a[i]);
27     insert_sort(a);
28     for(i=0;i<10;i++)
29         printf("%3d",a[i]);
30     puts("");
31     return 0;
32 }
View Code

逆序输出:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 void insert_sort(int a[])
 7 {
 8     for(int j=1;j<10;j++)
 9     {
10         int key=a[j];
11         int i=j-1;
12         while(i>=0 && a[i]<key)
13         {
14             a[i+1]=a[i];
15             i--;
16         }
17         a[i+1]=key;
18     }
19 }
20 
21 int main()
22 {
23     int a[10];
24     int i;
25     for(i=0;i<10;i++)
26         scanf("%d",&a[i]);
27     insert_sort(a);
28     for(i=0;i<10;i++)
29         printf("%3d",a[i]);
30     puts("");
31     return 0;
32 }
View Code

分治法:合并排序

对于两堆以排好序的,最底层的运行逻辑:

 1 #include <iostream>
 2 #include <cstdio>
 3 #define inf 1e9
 4 using namespace std;
 5 
 6 void merge_sort(int a[],int p,int q,int r)
 7 {
 8     int n1=q-p+1;
 9     int n2=r-q;
10     int i,j;
11     int L[n1+1],R[n2+1];
12     for(i=0;i<n1;i++)
13         L[i]=a[p+i];
14     for(i=0;i<n2;i++)
15         R[i]=a[q+i+1];
16     
17     L[n1]=inf;R[n2]=inf;
18     i=0;j=0;
19     for(int k=p;k<=r;k++)
20     {
21         if(L[i]<=R[j])
22         {
23             a[k]=L[i];
24             i++;
25         }
26         else
27         {
28             a[k]=R[j];
29             j++;
30         }
31     }
32 }
33 
34 
35 int main()
36 {
37     int i;
38     int a[10];
39     for(i=0;i<10;i++)
40         scanf("%d",&a[i]);
41     merge_sort(a,0,4,9);
42     for(i=0;i<10;i++)
43         printf("%3d",a[i]);
44     puts("");
45     return 0;
46 }
View Code

 一般性源码:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 #define inf 1e9
 5 
 6 using namespace std;
 7 
 8 void merge_sort(int a[],int p,int q,int r)
 9 {
10     int n1=q-p+1;
11     int n2=r-q;
12     int L[n1+1],R[n2+1];
13     int i,j;
14     
15     for(i=0;i<n1;i++)
16         L[i]=a[p+i];
17     for(i=0;i<n2;i++)
18         R[i]=a[q+i+1];
19     L[n1]=inf;R[n2]=inf;
20     i=0;j=0;
21     for(int k=p;k<=r;k++)
22     {
23         if(L[i]<=R[j])
24         {
25             a[k]=L[i];
26             i++;
27         }
28         else
29         {
30             a[k]=R[j];
31             j++;
32         }
33     }
34 }
35 
36 void Merge_sort(int a[],int p,int r)
37 {
38     if(p>=r)
39         return;
40     int q=(p+r)/2;
41     Merge_sort(a,p,q);
42     Merge_sort(a,q+1,r);
43     merge_sort(a,p,q,r);
44 }
45 
46 int main()
47 {
48     int a[10];
49     int i;
50     for(i=0;i<10;i++)
51         scanf("%d",&a[i]);
52     Merge_sort(a,0,9);
53     for(i=0;i<10;i++)
54         printf("%3d",a[i]);
55     puts("");
56     return 0;
57 }
View Code

不设置哨兵

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 
 5 using namespace std;
 6 
 7 void merge_sort(int a[],int p,int q,int r)
 8 {
 9     int n1=q-p+1;
10     int n2=r-q;
11     int L[n1+1],R[n2+1];
12     int i,j;
13     
14     for(i=0;i<n1;i++)
15         L[i]=a[p+i];
16     for(i=0;i<n2;i++)
17         R[i]=a[q+i+1];
18     i=0;j=0;
19     int k=p;
20     while(i<n1 && j<n2)
21     {
22         if(L[i]<=R[j])
23         {
24             a[k++]=L[i];
25             i++;
26         }
27         else
28         {
29             a[k++]=R[j];
30             j++;
31         }
32     }
33     if(i==n1)
34     {
35         for(;j<n2;j++)
36         {
37             a[k++]=R[j];
38         }
39     }
40     if(j==n2)
41     {
42         for(;i<n1;i++)
43         {
44             a[k++]=L[i];
45         }
46     }
47 }
48 
49 void Merge_sort(int a[],int p,int r)
50 {
51     if(p>=r)
52         return;
53     int q=(p+r)/2;
54     Merge_sort(a,p,q);
55     Merge_sort(a,q+1,r);
56     merge_sort(a,p,q,r);
57 }
58 
59 int main()
60 {
61     int a[10];
62     int i;
63     for(i=0;i<10;i++)
64         scanf("%d",&a[i]);
65     Merge_sort(a,0,9);
66     for(i=0;i<10;i++)
67         printf("%3d",a[i]);
68     puts("");
69     return 0;
70 }
View Code

利用归并排序求逆序数

 1 #include <iostream>
 2 #include <cstdio>
 3 #define inf 1e9
 4 
 5 using namespace std;
 6 int cnt;
 7 
 8 void merge_sort(int a[],int p,int q,int r)
 9 {
10     int n1=q-p+1;
11     int n2=r-q;
12     int L[n1+1],R[n2+1];
13     int i,j;
14     
15     for(i=0;i<n1;i++)
16         L[i]=a[p+i];
17     for(i=0;i<n2;i++)
18         R[i]=a[q+i+1];
19     i=0;j=0;
20     L[n1]=inf;R[n2]=inf;
21     
22     for(int k=p;k<=r;k++)
23     {
24         if(L[i]<=R[j])
25         {
26             a[k]=L[i];
27             i++;
28         }
29         else
30         {
31             a[k]=R[j];
32             j++;
33             cnt+=n1-i;//因为L已经排好序,只要有一个元素比R大,则后面的元素都比它大
34         }
35     }
36 }
37 
38 void Merge_sort(int a[],int p,int r)
39 {
40     if(p>=r)
41         return;
42     int q=(p+r)/2;
43     Merge_sort(a,p,q);
44     Merge_sort(a,q+1,r);
45     merge_sort(a,p,q,r);
46 }
47 
48 int main()
49 {
50     int a[8];
51     int i;
52     for(i=0;i<5;i++)
53         scanf("%d",&a[i]);
54     cnt=0;
55     Merge_sort(a,0,4);
56     for(i=0;i<5;i++)
57         printf("%3d",a[i]);
58     puts("");
59     printf("%d\n",cnt);
60     return 0;
61 }
View Code

 

posted @ 2016-05-02 14:36  指尖泛出的繁华  阅读(142)  评论(0编辑  收藏  举报