zoukankan      html  css  js  c++  java
  • 算法导论第二章

    插入排序源码:

     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
    ",cnt);
    60     return 0;
    61 }
    View Code
    活在现实,做在梦里。
  • 相关阅读:
    文本属性和属性连写
    并集选择器
    子代选择器
    后代选择器
    交集选择器
    xpath helper 表格爬取
    爬取xiachufang图片试手
    bs4 beautifullsoup网页内容选择器
    requests第三方库使用 抓取
    python 爬虫学习
  • 原文地址:https://www.cnblogs.com/do-it-best/p/5452335.html
Copyright © 2011-2022 走看看