• pat 09-排序1. 排序(25)


    突然发现堆排序不会了

    //25ms,stl自带,干过他真难
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int a[100000+5],i,n;
        while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            sort(a,a+n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    
    //31ms,原始希尔排序
    #include<stdio.h>
    void Shell_sort(int A[],int N)
    {
        int  i;
        for(int D=N/2;D>0;D/=2)//希尔增量
        {
            for(int P=D;P<N;P++)
            {
                int Tmp=A[P];
                for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
                    A[i]=A[i-D];
                A[i]=Tmp;
            }
        }
    }
    int main()
    {
        int a[100000+5],n,i;
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Shell_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    
    //测试6超时,1637ms,插入排序,效果比冒泡好
    #include<stdio.h>
    void Insertion_sort(int a[],int n)
    {
        int i;
        for(int p=1;p<n;p++)
        {
            int tmp=a[p];
            for(i=p;i>0&&a[i-1]>tmp;i--)
                a[i]=a[i-1];
            a[i]=tmp;
        }
    }
    int main()
    {
        int a[100000+5],n,i;
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Insertion_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    
    //测试4、6、8超时,冒泡
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    void Bubble_sort(int a[],int n)
    {
        for(int p=n-1;p>=0;p--)
        {
            int flag=0;
            for(int i=0;i<p;i++)
            {
                if(a[i]>a[i+1])
                {
                    swap(a[i],a[i+1]);
                    flag=1;
                }
            }
            if(flag==0) break;
        }
    }
    int main()
    {
        int a[100000+5],n,i;
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Bubble_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    
    //31ms,希尔排序,Hibbard增量
    #include<stdio.h>
    int b[20];
    int intt()
    {
        int i;
        b[0]=1;
        for(i=1;i<=20;i++)
        {
            b[i]=2*b[i-1];
            //printf("%d
    ",b[i]);
        }
    }
    void Shell_sort(int A[],int N)
    {
        int  i,k;
        for(i=20;i>=0;i--)
            if(b[i]<N) break;
        k=i;
        for(int D=b[k]-1;D>0;D=b[k]-1)//希尔增量
        {
            //printf("%d
    ",D);
            for(int P=D;P<N;P++)
            {
                int Tmp=A[P];
                for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
                    A[i]=A[i-D];
                A[i]=Tmp;
            }
            k--;
        }
    }
    int main()
    {
        int a[100000+5],n,i;
        intt();
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Shell_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    
    //27ms,希尔排序Sedgewick排序
    #include<stdio.h>
    #include<math.h>
    int b[20];
    int intt()
    {
        int i;
        b[1]=1;
        for(i=2;i<=9;i++)
        {
            b[i]=pow(4.0,i*1.0)-3*(pow(2.0,i*1.0))+1;
            //printf("%d
    ",b[i]);
        }
    }
    void Shell_sort(int A[],int N)
    {
        int  i,k;
        for(i=9;i>=0;i--)
            if(b[i]<N) break;
        k=i;
        for(int D=b[k];D>0;D=b[k])//希尔增量
        {
            //printf("%d
    ",D);
            for(int P=D;P<N;P++)
            {
                int Tmp=A[P];
                for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
                    A[i]=A[i-D];
                A[i]=Tmp;
            }
            k--;
        }
    }
    int main()
    {
        int a[100000+5],n,i;
        intt();
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Shell_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    
    //并归递归形式
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    const int inf=1<<30;
    const int N=100000+5;
    
    void Merge(int a[],int tmpa[],int l,int r,int rightend)
    {
        int leftend=r-1;
        int tmp=l;
        int numint=rightend-l+1;
        while(l<=leftend&&r<=rightend)
        {
            if(a[l]<=a[r]) tmpa[tmp++]=a[l++];
            else tmpa[tmp++]=a[r++];
        }
        while(l<=leftend)
            tmpa[tmp++]=a[l++];
        while(r<=rightend)
            tmpa[tmp++]=a[r++];
        for(int i=0;i<numint;i++,rightend--)
            a[rightend]=tmpa[rightend];
    }
    
    //分治
    void Msort(int a[],int tmpa[],int l,int rightend)
    {
        int center;
        if(l<rightend)
        {
            center=(l+rightend)/2;
            Msort(a,tmpa,l,center);
            Msort(a,tmpa,center+1,rightend);
            Merge(a,tmpa,l,center+1,rightend);
        }
    }
    
    //统一函数接口
    void Merge_sort(int a[],int n)
    {
        int tmpa[N];
        Msort(a,tmpa,0,n-1);
    }
    
    int main()
    {
        int a[100000+5],n,i;
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Merge_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    /*
    测试点 结果  用时(ms)  内存(kB)  得分/满分
    0   答案正确    1   312 1/1
    1   答案正确    1   184 10/10
    2   答案正确    1   312 2/2
    3   答案正确    4   312 2/2
    4   答案正确    29  1592    2/2
    5   答案正确    23  1592    2/2
    6   答案正确    23  1592    2/2
    7   答案正确    23  1664    2/2
    8   答案正确    26  1336    2/2
    */
    
    //并归,非递归形式
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    const int inf=1<<30;
    const int N=100000+5;
    
    void Merge1(int a[],int tmpa[],int l,int r,int rightend)
    {
        int leftend=r-1;
        int tmp=l;
        int numint=rightend-l+1;
        while(l<=leftend&&r<=rightend)
        {
            if(a[l]<=a[r]) tmpa[tmp++]=a[l++];
            else tmpa[tmp++]=a[r++];
        }
        while(l<=leftend)
            tmpa[tmp++]=a[l++];
        while(r<=rightend)
            tmpa[tmp++]=a[r++];
        for(int i=0;i<numint;i++,rightend--)
            a[rightend]=tmpa[rightend];
    }
    
    void Merge_pass(int a[],int tmpa[],int n,int length)
    {
        int i,j;
        for(i=0;i<=n-2*length;i+=2*length)
            Merge1(a,tmpa,i,i+length,i+2*length-1);
        if(i+length<n)
            Merge1(a,tmpa,i,i+length,n-1);
        else
            for(j=i;j<n;j++) tmpa[j]=a[j];
    }
    
    void Merge_sort(int a[],int n)
    {
        int tmpa[N];
        int length=1;
        while(length<n)
        {
            Merge_pass(a,tmpa,n,length);
            length*=2;
            Merge_pass(tmpa,a,n,length);
            length*=2;
        }
    }
    
    
    int main()
    {
        int a[100000+5],n,i;
         while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++) scanf("%d",&a[i]);
            Merge_sort(a,n);
            for(i=0;i<n-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[n-1]);
        }
        return 0;
    }
    /*
    测试点 结果  用时(ms)  内存(kB)  得分/满分
    0   答案正确    1   236 1/1
    1   答案正确    1   256 10/10
    2   答案正确    1   360 2/2
    3   答案正确    4   360 2/2
    4   答案正确    29  1564    2/2
    5   答案正确    22  1640    2/2
    6   答案正确    22  1640    2/2
    7   答案正确    22  1536    2/2
    8   答案正确    26  1384    2/2
    */
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    笨办法学Python——学习笔记4
    意识、语言、文字和程序感想
    笨办法学Python——学习笔记3
    把vim作为shell ide
    HDUYuna's confusion 树状数组 Or Multiset
    POJ3252 Round Numbers 组合数学
    HDU3874 Necklace 树状数组+离线处理
    UVA10212 The Last Nonzero Digit. 分解质因子+容斥定理
    HDU1041 Computer Transformation 大数
    HDUFish买电脑 二分查找
  • 原文地址:https://www.cnblogs.com/xryz/p/4848011.html
Copyright © 2020-2023  润新知