学习笔记----各种排序(先从宝哥这里转来,以后自己多写写)





各种排序。。。

最近想写一写排序。。所以就写了一下可是发现自己基础的知识都不会了,,哎,弱爆了。。。。

二叉树排序的链表实现与数组实现

#include <cstdio>

#include <iostream>

struct node

{

    int key;

    node *lc,*rc;

}*rt,*p;

void insert(node *rt,int x)

{

    if(x<=rt->key)

    {

        if(rt->lc==NULL) rt->lc=p;

        else insert(rt->lc,x);

    }

    else

    {

        if(rt->rc==NULL) rt->rc=p;

        else insert(rt->rc,x);

    }

}

void mid_vt(node *rt)

{

    if(rt)

    {

        mid_vt(rt->lc);

        printf("%d ",rt->key);

        mid_vt(rt->rc);

    }

}

int main()

{

    int n,i;

    scanf("%d",&n);

    for(i=0;i<n;i++)

    {

        p=new node;

        scanf("%d",&p->key);

        p->lc=NULL;

        p->rc=NULL;

        if(rt==NULL)

        rt=p;

        else

        insert(rt,p->key);

    }

    mid_vt(rt);

    return 0;

}

 

数组

#include <cstdio>

#include <cstring>

#include <iostream>

const int max_s=10000;

int l[max_s],r[max_s],key[max_s];

int ct;

void insert(int rt,int x)

{

    if(x<=key[rt])

    {

        if(l[rt]==-1) l[rt]=ct;

        else insert(l[rt],x);

    }

    else

    {

        if(r[rt]==-1) r[rt]=ct;

        else insert(r[rt],x);

    }

}

void mid_vt(int rt)

{

    if(l[rt]!=-1) mid_vt(l[rt]);

    printf("%d ",key[rt]);

    if(r[rt]!=-1) mid_vt(r[rt]);

}

int main()

{

    freopen("d.txt","r",stdin);

    memset(l,-1,sizeof(l));

    memset(r,-1,sizeof(r));

    int n,i,x;

    int rt;

    rt=-1;ct=0;

    scanf("%d",&n);

    for(i=0;i<n;i++)

    {

        scanf("%d",&x);

        if(rt==-1) key[++rt]=x;

        else

        {

            key[++ct]=x;

            insert(rt,x);

        }

    }

    mid_vt(rt);

    return 0;

}

快排:

#include <cstdio>

#include <cstring>

#include <iostream>

const int max_s=10007;

int a[max_s];

void Qsort(int a[],int left,int right)

{

    int key=a[left];

    int l,r;

    l=left;r=right;

    if(left>=right) return ;//递归出口。。忘了。。。

    while(l<r)

    {

      while(l<r&&a[r]>=key) r--;

      a[l]=a[r];

      while(l<r&&a[l]<=key) l++;

      a[r]=a[l];

    }

    a[l]=key;

    Qsort(a,left,l-1);

    Qsort(a,l+1,right);

}

int main()

{

    freopen("d.txt","r",stdin);

    int n,i;

    scanf("%d",&n);

    for(i=0;i<n;i++)

    scanf("%d",&a[i]);

    Qsort(a,0,n-1);

    for(i=0;i<n;i++)

    printf("%d ",a[i]);

    return 0;

}

归并排序

#include <cstdio>

#include <cstring>

const int max_s=10007;

int a[max_s];

void Merge(int a[],int l,int m,int r)

{

    int i,j,k,x[max_s],y[max_s];

    int n1=m-l+1;

    int n2=r-m;

    for(i=0;i<n1;i++)

    x[i]=a[l+i];

    for(i=0;i<n2;i++)

    y[i]=a[l+n1+i];

    x[n1]=y[n2]=max_s;//作用很大。、、、老是忘记。。

    for(k=l,i=0,j=0;k<=r;k++)

    {

        if(x[i]<=y[j])

        a[k]=x[i++];

        else

        a[k]=y[j++];

    }

}

void Merge_sort(int a[],int l,int r)

{

    if(l<r)

    {

        int m=(l+r)>>1;

        Merge_sort(a,l,m);

        Merge_sort(a,m+1,r);

        Merge(a,l,m,r);

    }

}

int main()

{

    freopen("d.txt","r",stdin);

    int n,i;

    scanf("%d",&n);

    for(i=0;i<n;i++)

    scanf("%d",&a[i]);

    Merge_sort(a,0,n-1);

    for(i=0;i<n;i++)

    printf("%d ",a[i]);

    printf("%d\n",a[n-1]);

    return 0;

}

堆排序:

#include <iostream>

#include <cstdio>

#define max_s 100007

using namespace std;

int a[max_s];

void head_adjust(int x,int n)

{

    int i,j,tmp;

    i=x;

    j=i<<1;

    tmp=a[x];

    while(j<=n)

    {

        while(j<n&&a[j]>a[j+1]) j++;

        if(tmp>a[j])

        {

            a[i]=a[j];

            i=j;

            j=2*j;

        }

        else

        break;

    }

    a[i]=tmp;

}

int main()

{

    freopen("d.txt","r",stdin);

    int n,i;

    scanf("%d",&n);

    for(i=0;i<n;i++)

    scanf("%d",&a[i]);

    for(i=n/2;i>=0;i--)//zhuyi

    head_adjust(i,n);

    while(n--)

    {

        printf("%d ",a[1]);

        a[1]=a[n+1];

        head_adjust(1,n);

    }

    return 0;

}

地址: http://hi.baidu.com/gbaoxing10/item/b00796c864c9c9c2964452ed?qq-pf-to=pcqq.c2c

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值