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\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/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\n",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/

posted @ 2015-05-04 13:57  xryz  阅读(161)  评论(0编辑  收藏  举报