Cod sursa(job #1275523)

Utilizator danielmaxim95FMI Maxim Daniel danielmaxim95 Data 25 noiembrie 2014 12:22:04
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.89 kb
#include <stdio.h>
#include <algorithm>
#include <cmath>

using namespace std;

struct nod {int info; nod* fs; nod* fd; int ns; int nd;int poz;};

nod* prim=NULL;
FILE *f;

void mareste(nod* p)
{
    if(p!=NULL)
    {
        p->poz++;
        mareste(p->fs);
        mareste(p->fd);
    }
}

void insereaza(nod* p, int y)
{
    if(p->info>=y)
    {
        p->poz++;
        mareste(p->fd);
        if(p->fs==NULL)
        {
            nod *np=new nod;
            np->info=y;np->fs=NULL;np->fd=NULL;np->ns=0;np->nd=0;
            p->fs=np;
            p->fs->poz=p->poz-1;
            p->ns=1;
        }
        else
        {
            insereaza(p->fs,y);
            p->ns=max(p->fs->ns,p->fs->nd)+1;
        }
    }

    else
        if(p->fd==NULL)
        {
            nod *np=new nod;
            np->info=y;np->fs=NULL;np->fd=NULL;np->ns=0;np->nd=0;
            p->fd=np;
            p->fd->poz=p->poz+1;
            p->nd=1;
        }
        else
        {
            insereaza(p->fd,y);
            p->nd=max(p->fd->ns,p->fd->nd)+1;
        }
}

void afiseaza(nod* p)
{
    if(p!=NULL)
    {

        afiseaza(p->fs);
        fprintf(f,"%i ",p->info);
        afiseaza(p->fd);
    }
}


void lrot(nod *&p)
{
    nod* a,*b,*c;
    a=p;
    b=p->fd;
    c=p->fd->fs;

    p=b;
    p->fs=a;
    p->fs->fd=c;


    p->fs->nd=p->ns;
    p->ns=max(p->fs->nd,p->fs->ns)+1;
}

void rrot(nod*& p)
{
    nod* a,*b,*c;
    a=p;
    b=p->fs;
    c=p->fs->fd;

    p=b;
    p->fd=a;
    p->fd->fs=c;

    p->fd->ns=p->nd;
    p->nd=max(p->fd->ns,p->fd->nd)+1;
}


void echilibreaza(nod* &p)
{
    if((p->ns >= 2)||(p->nd >= 2))
    {
        if(p->ns - p->nd >= 2)
            if(p->fs->ns - p->fs->nd > 0)
                {rrot(p);echilibreaza(p);}
            else
                {lrot(p->fs);echilibreaza(p);}
        else
            if((p->nd - p->ns >= 2))
                if(p->fd->nd - p->fd->ns > 0)
                    {lrot(p);echilibreaza(p);}
                else
                    {rrot(p->fd);echilibreaza(p);}
            else
            {
                echilibreaza(p->fs);
                echilibreaza(p->fd);
            }

            p->ns=max(p->fs->ns,p->fs->nd)+1;
            p->nd=max(p->fd->ns,p->fd->nd)+1;
    }
}

int cauta(nod* p,int k)
{
    if(p->poz==k)return p->info;
    else if(p->poz>k) return cauta(p->fs,k);
        else return cauta(p->fd,k);
}

int main()
{
    int i,n,x;
    f=fopen("algsort.in","r");
    fscanf(f,"%i",&n);
    fscanf(f,"%i",&x);
    nod *p=new nod;
    p->info=x;p->fs=NULL;p->fd=NULL;prim=p;p->ns=0;p->nd=0;p->poz=1;
    for(i=1;i<n;i++)
    {
        fscanf(f,"%i",&x);
        insereaza(prim, x);

    }
    fclose(f);
    echilibreaza(prim);
    f=fopen("algsort.out","w");
    afiseaza(prim);
    fclose(f);
    return 0;
}