Din fisierul date.in de pe prima linie se citeste un numar natural n, iar de pe urmatorul
rand n numere reale. Sa se scrie cele n numere citite, in ordine descrescatoare, in fisierul date.out pe
acelasi rand, despartite prin cate un spatiu.
Exemplu:
date.in date.out
5
8 9 1 0 -3 9 8 1 0 -3

Răspuns :

Explicație:

Prezint doua variante: prima, care este algoritmul de sortare mergesort bazat pe tehnica divide et impera, un algoritm optim din punct de vedere al timpului de executie, iar a doua, care este algoritmul de sortare prin interschimbare, nu la fel de optim ca si primul.

Prima varianta:

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("date.in");

ofstream fout("date.out");

void merge (int a[],int stang,int mijloc,int drept)

{

   int i,j,k;

   i=stang;

   j=mijloc+1;

   k=0;

   int temp[drept-stang+1];

   while(i<=mijloc&&j<=drept)

   {

       if(a[i]>a[j])

       {

           temp[k]=a[i];

           i=i+1;

       }

       else

       {

           temp[k]=a[j];

           j=j+1;

       }

       k=k+1;

   }

   while(i<=mijloc)

   {

       temp[k]=a[i];

       i=i+1;

       k=k+1;

   }

   while(j<=drept)

   {

       temp[k]=a[j];

       j=j+1;

       k=k+1;

   }

   for(k=0;k<=drept-stang;k++)

       a[stang+k]=temp[k];

}

void mergesort (int a[],int stang,int drept)

{

   int mijloc;

   if(stang<drept)

   {

       mijloc=(stang+drept)/2;

       mergesort(a,stang,mijloc);

       mergesort(a,mijloc+1,drept);

       merge(a,stang,mijloc,drept);

   }

}

int main()

{

   int a[100],n,i;

   fin>>n;

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

       fin>>a[i];

   mergesort(a,0,n-1);

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

       fout<<a[i]<<" ";

   fin.close();

   fout.close();

   return 0;

}

A doua varianta:

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("date.in");

ofstream fout("date.out");

int main()

{

   int a[100],n,i,j,aux;

   fin>>n;

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

       fin>>a[i];

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

       for(j=i+1;j<n;j++)

           if(a[i]<a[j])

           {

               aux=a[i];

               a[i]=a[j];

               a[j]=aux;

           }

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

       fout<<a[i]<<" ";

   fin.close();

   fout.close();

   return 0;

}