<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_6-a_lectia_25</id>
	<title>Clasa a 6-a lectia 25 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_6-a_lectia_25"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_6-a_lectia_25&amp;action=history"/>
	<updated>2026-04-15T10:18:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_6-a_lectia_25&amp;diff=16163&amp;oldid=prev</id>
		<title>Bella: Created page with &quot;= Lectie = == Metode de sortare ==  === 1 Sortarea prin interschimbare directa === Se dă un vector de &lt;tt&gt;n&lt;/tt&gt; elemente. Să se sorteze prin metoda interschimbarii directe....&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_6-a_lectia_25&amp;diff=16163&amp;oldid=prev"/>
		<updated>2019-04-05T13:37:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;= Lectie = == Metode de sortare ==  === 1 Sortarea prin interschimbare directa === Se dă un vector de &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; elemente. Să se sorteze prin metoda interschimbarii directe....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Lectie =&lt;br /&gt;
== Metode de sortare == &lt;br /&gt;
=== 1 Sortarea prin interschimbare directa ===&lt;br /&gt;
Se dă un vector de &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; elemente. Să se sorteze prin metoda interschimbarii directe.&lt;br /&gt;
Metoda interschimbarii directe: Vom compara fiecare element v[i] cu toate elementele de la dreapta lor, si oridecate ori gasim un element mai mic ca acesta, vom interschimba valoarea din v[i] cu valoarea din v[j].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
for ( i = 0; i &amp;lt; n - 1; i++ )  &lt;br /&gt;
  for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
    if ( v[i] &amp;gt; v[j] ) {         &lt;br /&gt;
      aux = v[i];&lt;br /&gt;
      v[i] = v[j];&lt;br /&gt;
      v[j] = aux;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 2 Metoda bulelor ===&lt;br /&gt;
Descrierea metodei: se parcurge vectorul și se compară fiecare element cu succesorul său. Dacă nu sunt în ordine cele două elemente se interschimbă între ele. Vectorul se parcurge de mai multe ori, până când la o parcurgere completă nu se mai execută nicio interschimbare între elemente (vectorul este sortat). Vom folosi o variabilă steguleţ pentru a marca faptul ca am efectuat o interschimbare, marcare care ne semnalează că incă vectorul nu a devenit sortat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
ok = 1;                       // pp ca vectorul este sortat&lt;br /&gt;
for ( i = 0; i &amp;lt; n - 1; i++ ) // parcurgem toate perechile de elemente vecine si le comparam&lt;br /&gt;
    if ( v[i] &amp;gt; v[i+1] ) {    // daca am gasit un element mai mare decat vecinul sau din dreapta     &lt;br /&gt;
      aux = v[i];             // interschimbam cele doua valori vecine&lt;br /&gt;
      v[i] = v[i+1];&lt;br /&gt;
      v[i+1] = aux;&lt;br /&gt;
      ok = 1;                 // si marcam ca am facut o modificare, deci nu a fost sortat&lt;br /&gt;
    }&lt;br /&gt;
}while(!ok);                  // repetam parcurgerea cata vreme nu avem sortat vectorul&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optimizare: Cum metoda garanteaza ca la prima parcurgere, pe ultima pozitie va ajunge cel mai mare element, la urmatoarea parcurgere nu mai este necesar sa luam in calcul si acest element. De asemenea, la a doua parcurgere, avem garantia ca pe penultima pozitie va ajunge cel mai mare element din elementele ramase, deci la urmatoarea parcurgere nu il vom mai lua in calcul nici pe acesta. ca o generalizare, la o parcurgere &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;, vom avea de sortat doar &amp;#039;&amp;#039;&amp;#039;n-p&amp;#039;&amp;#039;&amp;#039; valori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
do {&lt;br /&gt;
ok = 1;                       // pp ca vectorul este sortat&lt;br /&gt;
p = 1;                        // numarul de parcurgerii vectorului curente&lt;br /&gt;
for ( i = 0; i &amp;lt; n - p; i++ ) // parcurgem toate perechile de elemente vecine si le comparam&lt;br /&gt;
    if ( v[i] &amp;gt; v[i+1] ) {    // daca am gasit un element mai mare decat vecinul sau din dreapta     &lt;br /&gt;
      aux = v[i];             // interschimbam cele doua valori vecine&lt;br /&gt;
      v[i] = v[i+1];&lt;br /&gt;
      v[i+1] = aux;&lt;br /&gt;
      ok = 1;                 // si marcam ca am facut o modificare, deci nu a fost sortat&lt;br /&gt;
    }&lt;br /&gt;
    p++;                      // trecem la urmatoarea parcurgere a vectorului&lt;br /&gt;
}while(!ok);                  // repetam parcurgerea cata vreme nu avem sortat vectorul&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3 Sortarea prin selecție (select sort) ===&lt;br /&gt;
Se dă un vector de &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; elemente. Să se sorteze prin metoda selecției. Prin sortare înțelegem ordonare crescătoare a elementelor vectorului. Metoda selecției este următoarea: vom găsi maximul din vector, împreună cu poziția sa. Apoi vom interschimba maximul cu ultimul element din vector. Astfel ne vom asigura că ultimul element este chiar cel corect în vectorul ordonat. Ne-a rămas astfel un vector cu &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt; elemente, care trebuie sortat. Vom proceda la fel: vom găsi maximul în subvectorul de &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt; elemente, precum și poziția lui, și-l vom muta la coadă, rezultînd un vector de &amp;lt;tt&amp;gt;n-2&amp;lt;/tt&amp;gt; elemente. Continuăm procedura pînă ce vectorul este sortat.&lt;br /&gt;
&lt;br /&gt;
Iată o exemplificare grafică:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:0.05pt solid #000000;padding:0.0382in;&amp;quot;|&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039; 2 8 3 6 5 3 9 6 |&lt;br /&gt;
 6 2 8 3 6 5 3 &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039; | 9&lt;br /&gt;
 6 2 &amp;#039;&amp;#039;&amp;#039;8&amp;#039;&amp;#039;&amp;#039; 3 6 5 3 | 9 9&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;6&amp;#039;&amp;#039;&amp;#039; 2 3 3 6 5 | 8 9 9&lt;br /&gt;
 5 2 3 3 &amp;#039;&amp;#039;&amp;#039;6&amp;#039;&amp;#039;&amp;#039; | 6 8 9 9&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;5&amp;#039;&amp;#039;&amp;#039; 2 3 3 | 6 6 8 9 9&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039; 2 3 | 5 6 6 8 9 9&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039; 2 | 3 5 6 6 8 9 9&lt;br /&gt;
 2 | 3 3 5 6 6 8 9 9&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 2 3 3 5 6 6 8 9 9&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Iată programul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;// avem vectorul v de n elemente&lt;br /&gt;
for ( i = n – 1; i &amp;gt; 0; i-- ) {   // pozitia ultimului element din subvector&lt;br /&gt;
  max = v[0];&lt;br /&gt;
  p = 0;                          // p este poziția maximului&lt;br /&gt;
  for ( j = 1; j &amp;lt;= i; i++ )&lt;br /&gt;
    if ( v[j] &amp;gt; max ) {          // memoram noul maxim si pozitia lui&lt;br /&gt;
      max = v[j];&lt;br /&gt;
      p = j;&lt;br /&gt;
    }&lt;br /&gt;
  // interschimbam maximul de pe pozitia p cu ultimul element, pe pozitia i&lt;br /&gt;
  v[p] = v[u];&lt;br /&gt;
  v[u] = max;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O alta modalitate de a implementa aceasta metoda este de a cauta minimul si a-l aduce pe prima pozitie in vector.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
for ( i = 0; i &amp;lt; n - 1; i++ ){&lt;br /&gt;
    min = div[i]; p = i;&lt;br /&gt;
    for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
      if ( min &amp;gt; v[j]  ){&lt;br /&gt;
        max = v[j];&lt;br /&gt;
        p = j;&lt;br /&gt;
    }&lt;br /&gt;
    v[p] = v[i];&lt;br /&gt;
    v[i] = max;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vă recomand folosirea algoritmului de sortare prin selecție și nu a sortării cu bule, deoarece face mai puține operații. În practică el este de cinci pînă la zece ori mai rapid. Desigur, și mai rapidă este sortarea prin vectori de frecvență, numită și sortare prin numărare, atunci cînd ea poate fi aplicată (cînd numerele sînt foarte mici).&lt;br /&gt;
&lt;br /&gt;
=== 4 Sortarea prin insertie ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i, v[1000], x;&lt;br /&gt;
&lt;br /&gt;
  // citim sirul de n elemente si le inseram in vector inainte de ultimul element mai mare ca el&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;x );         // citim elem de pe pozitia i, deci pana acum am pus elem pana la i-1&lt;br /&gt;
    int p = i - 1;             // pornim de la ultimul element adaugat in vector&lt;br /&gt;
    while(p &amp;gt;= 0 &amp;amp;&amp;amp; v[p] &amp;gt; x ) // cata vreme elementul curent e mai mare decat x&lt;br /&gt;
        v[p + 1] = v[p], p --; // il mut la dreapta&lt;br /&gt;
    v[p + 1] = x;              // acum a[p] e mai mic sau egal cu x, si a[p+1] e liber&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    printf( &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5 Sortarea prin numarare ===&lt;br /&gt;
Acest tip de sortare l-am folosit cand am studiat vectorii caracteristi ( de frecventa )&lt;br /&gt;
&lt;br /&gt;
=== 5 Sortarea rapida - Quicksort ===&lt;br /&gt;
Algoritmul acestui tip de sortare va fi studiat in clasa a 10-a. Putem sorta rapid insa folosing functia predefinita din biblioteca algorithm care are complexitate O( n log n)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i, j, v[1000], aux;&lt;br /&gt;
&lt;br /&gt;
  // citim sirul de n elemente si  memoram valorile sale in vectorul v&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
&lt;br /&gt;
  sort( v, v + n );&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    printf( &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aplicatii ==&lt;br /&gt;
=== Implementare sortare prin interschimbare === &lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=509 Ordonare] ====&lt;br /&gt;
- sortare crescatoare&lt;br /&gt;
Se dă un sir cu n(1 ≤ n ≤ 1000) elemente numere naturale x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; &amp;lt; 1.000.000.000. Să se ordoneze crescător elementele vectorului.&lt;br /&gt;
- sortare descrescatoare ( impllemntati probleme [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=129 Sortare] )&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Metoda interschimbarii directe - complexitate O(n^2)&lt;br /&gt;
// Fiecare element v[i] va fi comparat cu elementele din dreapta v[j].&lt;br /&gt;
// Daca v[j] e mai mic, interschimbam valorile de pe cele doua pozitii i si j&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i, j, v[1000], aux;&lt;br /&gt;
  &lt;br /&gt;
  // citim sirul de n elemente si  memoram valorile sale in vecotrul v&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
  &lt;br /&gt;
  // sortam elementele &lt;br /&gt;
  for ( i = 0; i &amp;lt; n - 1; i++ )&lt;br /&gt;
      for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
        if ( v[i] &amp;gt; v[j] ) {&lt;br /&gt;
          aux = v[i];&lt;br /&gt;
          v[i] = v[j];&lt;br /&gt;
          v[j] = aux;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    printf( &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=86 halfsort] ====&lt;br /&gt;
Să se scrie un program care ordonează crescător elementele din prima jumătate a unui vector și descrescător elementele din a doua jumătate.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int v[100];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  FILE *fin = fopen( &amp;quot;halfsort.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  FILE *fout = fopen( &amp;quot;halfsort.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  int n, i, j, aux;&lt;br /&gt;
  fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
      fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
&lt;br /&gt;
  // sortam crescator elem din prima jumatate&lt;br /&gt;
  for( i = 0; i &amp;lt; n / 2; i ++ )&lt;br /&gt;
    for(j = i + 1; j &amp;lt; n / 2; j ++ )&lt;br /&gt;
      if( v[i] &amp;gt; v[j] ){&lt;br /&gt;
        aux = v[i];&lt;br /&gt;
        v[i] = v[j];&lt;br /&gt;
        v[j] = aux;&lt;br /&gt;
      }&lt;br /&gt;
  // sortam descrescator elem din a doua jumatate&lt;br /&gt;
  for( i = n / 2; i &amp;lt; n; i ++ )&lt;br /&gt;
    for( j = i + 1; j &amp;lt; n; j ++ )&lt;br /&gt;
      if( v[i] &amp;lt; v[j] ){&lt;br /&gt;
        aux = v[i];&lt;br /&gt;
        v[i] = v[j];&lt;br /&gt;
        v[j] = aux;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    fprintf( fout, &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
  fclose( fin );&lt;br /&gt;
  fclose( fout );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativa mai rapida de sortare :&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;cstdio&amp;gt;&lt;br /&gt;
#include&amp;lt;algorithm&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int v[102];&lt;br /&gt;
int cmp(int a, int b){&lt;br /&gt;
    return a &amp;gt; b;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
	FILE *fin, *fout;&lt;br /&gt;
	int n, i, j, aux;&lt;br /&gt;
&lt;br /&gt;
    fin = fopen(&amp;quot;halfsort.in&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
    fout = fopen(&amp;quot;halfsort.out&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
    fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++)&lt;br /&gt;
       fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
    sort(v , v + n / 2 );&lt;br /&gt;
    sort(v + n / 2 , v + n, cmp );&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i++)&lt;br /&gt;
      fprintf(fout, &amp;quot;%d &amp;quot;, v[i]);&lt;br /&gt;
	fclose(fin);&lt;br /&gt;
	fclose(fout);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementare Select Sort  ===&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1191 Arhitectura]====&lt;br /&gt;
Se citesc n numere naturale reprezentând înălțimile a n clădiri. Cerința problemei este de a realiza un proiect de arhitectură în care clădirile sunt ordonate descrescător după înălțimea lor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int v[1000];&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int i, n, p, max, j;&lt;br /&gt;
    scanf ( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
    for ( i = 0; i &amp;lt; n; i ++ ) {&lt;br /&gt;
       scanf ( &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
    }&lt;br /&gt;
    for ( i = 0; i &amp;lt; n - 1; i ++ ){&lt;br /&gt;
       max = 0;&lt;br /&gt;
       for ( j = i; j &amp;lt; n; j ++ ){;&lt;br /&gt;
          if ( max &amp;lt; v[j] ){&lt;br /&gt;
            max = v[j];&lt;br /&gt;
            p = j;&lt;br /&gt;
          }&lt;br /&gt;
       }&lt;br /&gt;
       v[p] = v[i];&lt;br /&gt;
       v[i] = max;&lt;br /&gt;
    }&lt;br /&gt;
    for ( i = 0; i &amp;lt; n; i ++ )&lt;br /&gt;
      printf ( &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1608 Sortare Divizori]====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Metoda de sortare select sort + numarare divizori folosind descompunerea in factori primi&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i, j, v[1000], div[1000], aux, nrdiv, d ;&lt;br /&gt;
  FILE *fin = fopen( &amp;quot;sortare_divizori.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
	FILE *fout = fopen ( &amp;quot;sortare_divizori.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
  fscanf( fin,&amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ ){&lt;br /&gt;
    fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp; v[i] );&lt;br /&gt;
    nrdiv = 1;&lt;br /&gt;
    d = 2;&lt;br /&gt;
    int x = v[i], p;&lt;br /&gt;
    while ( d * d &amp;lt;= x ){&lt;br /&gt;
      p = 0;&lt;br /&gt;
      while ( x % d == 0 ){&lt;br /&gt;
        x = x / d;&lt;br /&gt;
        p ++;&lt;br /&gt;
      }&lt;br /&gt;
      nrdiv *= ( p + 1 );&lt;br /&gt;
      d ++;&lt;br /&gt;
    }&lt;br /&gt;
    if ( x &amp;gt; 1 )&lt;br /&gt;
      nrdiv *= 2;&lt;br /&gt;
    div[i] = nrdiv;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // sortam elementele dupa nr de divizori in ordine crescatoare&lt;br /&gt;
  int poz, max;&lt;br /&gt;
  for ( i = 0; i &amp;lt; n - 1; i++ ){&lt;br /&gt;
    max = div[i]; poz = i;&lt;br /&gt;
    for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
      if ( max &amp;lt; div[j] || ( max == div[j] &amp;amp;&amp;amp; v[poz] &amp;gt; v[j]) ){&lt;br /&gt;
        max = div[j];&lt;br /&gt;
        poz = j;&lt;br /&gt;
    }&lt;br /&gt;
    aux = v[poz];&lt;br /&gt;
    v[poz] = v[i];&lt;br /&gt;
    v[i] = aux;&lt;br /&gt;
    div[poz] = div[i];&lt;br /&gt;
    div[i] = max;&lt;br /&gt;
  }&lt;br /&gt;
  // afisam vectorul sortat&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    fprintf( fout, &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortarea prin numarare ==&lt;br /&gt;
Aplicatie: arhitectura 2&lt;br /&gt;
Pentru aceasta problema am ales sortarea prin vector de frecventa deoarece, daca am sorta toate de le n = 2 milioane de elemente folosind algoritmii invatati, am avea o complexitate O(n*n) ceea ce ar conduce la depasirea timpului cerut de exectutie. &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Sortare prin numarare ( folosim vector de frecventa )&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int v[100001];	  // val maxima este 100000&lt;br /&gt;
int a[2000002];   // 2mil de elemente + 2 pseudocladiri ( santinele )&lt;br /&gt;
int main(){&lt;br /&gt;
    FILE *fin , *fout;&lt;br /&gt;
    fin = fopen ( &amp;quot;arhitectura2.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
    fout = fopen ( &amp;quot;arhitectura2.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
    int n, k, i, nr;&lt;br /&gt;
    &lt;br /&gt;
    // construim un vector de frecventa pentru a sorta cele n valori&lt;br /&gt;
    fscanf ( fin , &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
    for ( i = 0; i &amp;lt; n; i++ ){&lt;br /&gt;
        fscanf ( fin , &amp;quot;%d&amp;quot;, &amp;amp;nr );&lt;br /&gt;
        v[nr] ++;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // parcurgem vectorul de frecventa si reconstruim sirul de n valori, in ordine descrescatoare&lt;br /&gt;
    k = 0;&lt;br /&gt;
    for ( i = 100000; i &amp;gt;= 0; i-- )&lt;br /&gt;
        while ( v[i] != 0 ){&lt;br /&gt;
            a[++k] = i;&lt;br /&gt;
            v[i]--;&lt;br /&gt;
            fprintf ( fout , &amp;quot;%d &amp;quot;, a[k] );            &lt;br /&gt;
        }        &lt;br /&gt;
    fprintf ( fout, &amp;quot;\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    // pentru fiecare element din sir verificam daca e media valorilor vecine&lt;br /&gt;
    a[0] = a[k+1] = 0;          // pseudocladirile : santinele&lt;br /&gt;
    for ( i = 1; i &amp;lt;= k; i++ ){&lt;br /&gt;
        if ( 2 * a[i] == a[ i - 1 ] + a[ i + 1 ]  )&lt;br /&gt;
            fprintf ( fout , &amp;quot;1 &amp;quot; );&lt;br /&gt;
        else&lt;br /&gt;
            fprintf ( fout , &amp;quot;0 &amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
    fclose ( fin );&lt;br /&gt;
    fclose ( fout );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ca o alternativa mai rapid de implemntat in conditii de olimpiada aveti algormul de mai jos, cu complexitate apropiata de cea a algoritmului anterior, dar care intra in timp. Complexitatea fiin O( n log n ) data de complexitatea algoritmului rapid de sortare definit in biblioteca algorithm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Sol cu qsort -sort de biblioteca&lt;br /&gt;
#include&amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int v[2000003];&lt;br /&gt;
int cmp(int a, int b){&lt;br /&gt;
    return a&amp;gt;b;&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
    ifstream fin(&amp;quot;arhitectura2.in&amp;quot;);&lt;br /&gt;
    ofstream fout(&amp;quot;arhitectura2.out&amp;quot;);&lt;br /&gt;
    int n;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n;&lt;br /&gt;
    for(int i=1; i &amp;lt;= n; i++)&lt;br /&gt;
        fin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
    sort(v+1, v+n+1, cmp);&lt;br /&gt;
    for(int i=1; i &amp;lt;= n; i++)&lt;br /&gt;
        fout &amp;lt;&amp;lt; v[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;#039;\n&amp;#039;;&lt;br /&gt;
    for(int i=1; i &amp;lt;= n; i++){&lt;br /&gt;
        if(2*v[i]==v[i-1]+v[i+1])&lt;br /&gt;
            fout &amp;lt;&amp;lt; &amp;quot;1 &amp;quot;;&lt;br /&gt;
        else fout &amp;lt;&amp;lt; &amp;quot;0 &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tema = &lt;br /&gt;
Runda pbinfo&lt;br /&gt;
== Optional ==&lt;br /&gt;
==== Probleme de studiu ==== &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1123 iepurasi] - Pancake sorting. Sortati conform indicatiilor, fara sa tineti cont ca se cere numarul minim de tap-uri.&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>