Sunteți pe pagina 1din 4

Lecţia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

Sortarea vectorilor.

Prin sortare se înţelege aranjarea elementelor unui vector în ordine crescătoare sau descrescătoare.
Pentru rezolvarea acestei probleme au fost concepuţi diverşi algoritmi, mai mult sau mai puţin rapizi, mai simpli sau extrem de
complicaţi.

Sortarea prin selecţie directă

Conform acestei metode primul element (a[1]) se compară pe rând cu toate elementele de după el şi dacă ordinea de sortare nu
este respectată, cele două elemente se interschimbă. După efectuarea tuturor comparaţiilor, în prima poziţie ajunge cel mai mic
element din vector (în cazul ordonării crescătoare). Se compară apoi al doilea element cu toate elementele de după el etc.
La ultimul pas se compară numai ultimele două elemente. Secvenţa corespunzătoare 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 crescătoare */
{ aux=a[i];
a[i]=a[j]; /* interschimbăm elementele */
a[j]=aux;
}

Metoda de sortare prin selectie are complexitate O(n2). Pentru cei care cunoașteți ș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 decît 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 deplasării elementelor unui vector cu o poziție spre stânga sau cu o poziție spre dreapta.
Bineînțeles că deplasarea elementelor vectorului se poate face și cu k pozitii spre stânga sau k pozitii spre dreapta.

permutarea circulara spre stânga, cu o poziție permutarea ciculara spre dreapta cu o poziție

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
Lecţia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

Afișarea tuturor permutărilor spre stânga Afișarea tuturor permutărilor 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
Lecţia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

Probleme propuse spre rezolvare pentru fixarea cunoștintelor

1.Fie v un vector cu n elemente întregi, date de la tastatură. Realizați programe C++ care:
a.Inversează valorile din vector și afișează 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 poziție și afișează 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 stânga cu o poziție și afișează 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 poziția p din vector și afișează 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 poziția p valoarea x și afișează 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 crescătoare


g.construieşte şirul a care conţine toate poziţiile din şirul v pe care se găseşte o valoare dată c
h. construieşte şirul b care se obţine din şirul v prin eliminarea tuturor elementelor de poziţiile 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
Lecţia 10 Sortarea tablourilor unidimensionale in C++. Permutari circulare.

Clasa a V-a

4.Bitonă: verificare secvență bitonă prin rotație. O secvență este bitonă dacă mai întîi crește și apoi, eventual, descrește.
O secvență bitonă prin rotație este o secvență care fie este bitonă, fie poate fi făcută bitonă prin rotații succesive.
Încercați să o rezolvați fără a folosi vectori, similar cu problema secvenței crescătoare prin rotație.
5.Majoritar: dat un vector cu n elemente să se spună dacă conține un element majoritar. Un element majoritar este un element
care apare de cel puțin n/2 + 1 ori. Încercați să dați o soluție mai bună decît sortarea.
6.Selecție: dat un șir de n numere și o poziție k în acel șir să se spună ce element s-ar afla pe acea poziție dacă șirul ar fi sortat.
7.Secvență crescătoare prin rotație
Verificare secvență crescătoare prin rotație. O secvență este crescătoare prin rotație dacă fie este crescătoare
(nedescrescătoare, include mai mic sau egal), fie poate fi făcută crescătoare prin rotații succesive
(permutări circulare).

Tema

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


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

Trimiteţi soluţiile pe adresa maftei03@gmail.com sub forma unei arhive denumită cu numele vostru.
Creaţi arhiva urmând paşii:
1. Creaţi un folder cu numelevostru_tema5
2. Copiati una câte una sursele main.cpp în acest folder şi redenumiţi-le cu numele problemei
3. Arhivaţi acest folder pastrand numele arhivei identic cu al folderului
4. Ataşaţi arhiva la email-ul pe care îl trimiteţi la adresa maftei03@gmail.com

Termen: 12 martie 2016, ora 21

SUCCES!

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