Sunteți pe pagina 1din 4

Lecia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

Sortarea vectorilor.

Prin sortare se nelege aranjarea elementelor unui vector n ordine cresctoare sau descresctoare.
Pentru rezolvarea acestei probleme au fost concepui diveri algoritmi, mai mult sau mai puin rapizi, mai simpli sau extrem de
complicai.

Sortarea prin selecie direct

Conform acestei metode primul element (a[1]) se compar pe rnd cu toate elementele de dup el i dac ordinea de sortare nu
este respectat, cele dou elemente se interschimb. Dup efectuarea tuturor comparaiilor, n prima poziie ajunge cel mai mic
element din vector (n cazul ordonrii cresctoare). Se compar apoi al doilea element cu toate elementele de dup el etc.
La ultimul pas se compar numai ultimele dou elemente. Secvena corespunztoare de program este :

for(i=1; i<=n-1; i++) /* elementul care se compar */


for(j=i+1;j<=n; j++) /* elem. de dup el cu care se compar */
if(a[i]>a[j]) /* pentru ordonare cresctoare */
{ aux=a[i];
a[i]=a[j]; /* interschimbm elementele */
a[j]=aux;
}

Metoda de sortare prin selectie are complexitate O(n2). Pentru cei care cunoatei i algoritmul de sortare bubble sort, care
este un algoritm tot cu complexitate O(n2), este recomandabil a nu-l folosi. n practic este de circa zece ori mai lent dect select
sort.
Exist un algoritm Quicksort care este O(n log n) pe cazul mediu. Sortarea optimal este O(n log n), deci nu se poate mai bine.

Permutari circulare

n multe probleme apare necesitatea deplasrii elementelor unui vector cu o poziie spre stnga sau cu o poziie spre dreapta.
Bineneles c deplasarea elementelor vectorului se poate face i cu k pozitii spre stnga sau k pozitii spre dreapta.

permutarea circulara spre stnga, cu o poziie permutarea ciculara spre dreapta cu o poziie

x=v[1]; x=v[n];
for(i=2;i<=n;i++) for(i=n-1;i>=1;i++)
v[i-1]=v[i]; v[i+1]=v[i];
v[n]=x; v[1]=x;

1
Lecia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

Afiarea tuturor permutrilor spre stnga Afiarea tuturor permutrilor spre dreapta,
ale unui vector cu n elemente ale unui vector cu n elemente

for(k=1;k<=n;k++) for(k=1;k<=n;k++)
{ x=v[1]; { x=v[n];
for(i=2;i<=n;i++) for(i=n-1;i>=1;i--)
v[i-1]=v[i]; v[i+1]=v[i];
v[n]=x; v[1]=x;
for(i=1;i<=n;i++) for(i=1;i<=n;i++)
fout<<v[i]<<' '; fout<<v[i]<<' ';
} }

Problem rezolvat

Se citeste din fisierul de intrare cifre.in un numar natural n, cu cel mult 9 cifre. Sa se afiseze numerele obtinute prin permutarea
circulara a cifrelor lui n in fisierul de iesire cifre.out.

#include <fstream>
using namespace std;
ifstream fin("cifre.in");
ofstream fout("cifre.out");
int n,x,p,nrcif,i;
int main()
{ fin >> n;x=n;
//determin numarul de cifre ale lui n
while ( x )
{ nrcif++;
x/=10;
}
//determin putera lui 10
x=n;p=1;
while ( x > 9 )
{ x = x/10;
p = p * 10;
}
//construiesc permutarile lui n
for (i = 1; i <= nrcif;i++)
{ x=n;
while ( x > 9 )
x = x/10;
n = n%p*10 + x;
fout << n;
fout << '\n';
}
return 0;
}
Se recomanda rezolvarea problemei cu vectori, ca exercitiu

2
Lecia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

Probleme propuse spre rezolvare pentru fixarea cunotintelor

1.Fie v un vector cu n elemente ntregi, date de la tastatur. Realizai programe C++ care:
a.Inverseaz valorile din vector i afieaz vectorul inversat (Ex. n=4, v=( 11,22,33,44) dup inversare v=(44, 33,22,11)
for(i=1;i<=n/2;i++)
{
aux = v[n-i+1];
v[n-i+1] = v[i];
v[i] = aux;
}
b.Realizeaz o permutare circular la dreapta cu o poziie i afieaz vectorul rezultat (Ex. n=4, v=( 11,22,33,44) dup
permutare v=(44, 11,22, 33)
aux = v[n];
for(i=n;i>0;i)
v[i]=v[i-1];
v[1] = aux;
c.Realizeaz o permutare circular la stnga cu o poziie i afieaz vectorul rezultat (Ex. n=4, v=( 11,22,33,44) dup
permutare v=(22, 33, 44, 11)
aux = v[1];
for(i=1;i<n;i++)
v[i]=v[i+1];
v[n] = aux;
d.terge valoarea de pe poziia p din vector i afieaz vectorul rezultat(Ex. n=4, p=2, v=( 11,22,33,44) dup tergere
v=(11, 33, 44) ;n=3
cin >> p;
for(i=p;i<n;i++)
v[i] = v[i+1];
n-;
e.Insereaz pe poziia p valoarea x i afieaz vectorul rezultat (Ex. n=4, p=2, x=100,v=( 11,22,33,44) dup inserare
v=(11,100,22, 33, 44); n=5
cin >> p;
cout << v[p] = ; cin >> x;
for(i=n;i>=p;i)
v[i+1]=v[i];
n++;
v[p] = x;

f. verific dac toate elementele irului sunt n ordine cresctoare


g.construiete irul a care conine toate poziiile din irul v pe care se gsete o valoare dat c
h. construiete irul b care se obine din irul v prin eliminarea tuturor elementelor de poziiile p, p+1, p+2.k,
unde k si p sunt numere date si apoi afiseaz irul.
3.Se citeste un vector a cu n elemente numere naturale. Contruiti permutarile circulare ale vectorului a si afisati permutarea
circulara care contine o secventa de lungime maxima format din elemente ordonate strict crescator.
Exemplu: n=6
a=(3 6 7 5 1 2)
Permutarea care contine secventa maxim este (5 1 2 3 6 7) sau (1 2 3 6 7 5)

3
Lecia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

4.Biton: verificare secven biton prin rotaie. O secven este biton dac mai nti crete i apoi, eventual, descrete.
O secven biton prin rotaie este o secven care fie este biton, fie poate fi fcut biton prin rotaii succesive.
ncercai s o rezolvai fr a folosi vectori, similar cu problema secvenei cresctoare prin rotaie.
5.Majoritar: dat un vector cu n elemente s se spun dac conine un element majoritar. Un element majoritar este un element
care apare de cel puin n/2 + 1 ori. ncercai s dai o soluie mai bun dect sortarea.
6.Selecie: dat un ir de n numere i o poziie k n acel ir s se spun ce element s-ar afla pe acea poziie dac irul ar fi sortat.
7.Secven cresctoare prin rotaie
Verificare secven cresctoare prin rotaie. O secven este cresctoare prin rotaie dac fie este cresctoare
(nedescresctoare, include mai mic sau egal), fie poate fi fcut cresctoare prin rotaii succesive
(permutri circulare).

Tema

http://www.pbinfo.ro/: SortPrime, Inaltimi, SortPie, KSort


http://varena.ro: Selectie, Culori, Cartonas
http://campion.edu.ro: sume, aparitii

Trimitei soluiile pe adresa maftei03@gmail.com sub forma unei arhive denumit cu numele vostru.
Creai arhiva urmnd paii:
1. Creai un folder cu numelevostru_tema5
2. Copiati una cte una sursele main.cpp n acest folder i redenumii-le cu numele problemei
3. Arhivai acest folder pastrand numele arhivei identic cu al folderului
4. Ataai arhiva la email-ul pe care l trimitei la adresa maftei03@gmail.com

Termen: 12 martie 2016, ora 21

SUCCES!

S-ar putea să vă placă și