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

来源:互联网 发布:vb与三菱plc通讯案例 编辑:程序博客网 时间:2024/04/28 22:27

突然发现堆排序不会了

//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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",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\n",a[n-1]);    }    return 0;}/*测试点 结果  用时(ms)  内存(kB)  得分/满分0   答案正确    1   312 1/11   答案正确    1   184 10/102   答案正确    1   312 2/23   答案正确    4   312 2/24   答案正确    29  1592    2/25   答案正确    23  1592    2/26   答案正确    23  1592    2/27   答案正确    23  1664    2/28   答案正确    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\n",a[n-1]);    }    return 0;}/*测试点 结果  用时(ms)  内存(kB)  得分/满分0   答案正确    1   236 1/11   答案正确    1   256 10/102   答案正确    1   360 2/23   答案正确    4   360 2/24   答案正确    29  1564    2/25   答案正确    22  1640    2/26   答案正确    22  1640    2/27   答案正确    22  1536    2/28   答案正确    26  1384    2/2*/
0 0
原创粉丝点击