<?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=10_2018_Lectia24</id>
	<title>10 2018 Lectia24 - 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=10_2018_Lectia24"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia24&amp;action=history"/>
	<updated>2026-04-15T10:06:14Z</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=10_2018_Lectia24&amp;diff=16103&amp;oldid=prev</id>
		<title>Bella: /* TEMA */</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia24&amp;diff=16103&amp;oldid=prev"/>
		<updated>2019-03-27T14:40:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;TEMA&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Tema Rezolvari =&lt;br /&gt;
= Lectie =&lt;br /&gt;
== Merge Sort ==&lt;br /&gt;
&lt;br /&gt;
Sortarea prin interclasare este un exemplu tipic de algoritm divide et impera : &lt;br /&gt;
&lt;br /&gt;
* se sortează o secvență delimitată de indicii st și dr:&lt;br /&gt;
* dacă st &amp;lt;= dr, problema este elementară, secvența fiind deja sortată&lt;br /&gt;
* dacă st &amp;lt; dr:&lt;br /&gt;
** se împarte problema în subprobleme, identificând mijlocul secvenței,  m = (st + dr) / 2;&lt;br /&gt;
** se rezolvă subproblemele, sortând secvența delimitată de st și m, respectiv secvența delimitată de m+1 și dr – apeluri recursive;&lt;br /&gt;
** se combină soluțiile, interclasând cele două secvențe; în acest fel, secvența delimitată de st și dr este sortată.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
complexitatea sortării prin interclasare este O(n⋅logn);&lt;br /&gt;
pentru interclasare este este necesar un spațiu de memorie suplimentar, de dimensiunea tabloului care se sortează;&lt;br /&gt;
în secvența de mai sus tabloul tmp a fost declarat global; declararea sa locală poate duce la depășirea stivei; o soluție pentru această situație poate fi alocarea dinamică a tabloului auxiliar.&lt;br /&gt;
&lt;br /&gt;
[[Image:mergesort.gif]]&lt;br /&gt;
&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;
int tmp[100000], v[100000];&lt;br /&gt;
&lt;br /&gt;
void MergeSort( int v[], int st, int dr ) {&lt;br /&gt;
  if( st &amp;lt; dr ){&lt;br /&gt;
    int m = (st + dr) / 2;&lt;br /&gt;
&lt;br /&gt;
    MergeSort ( v, st , m );           // ordonam prima jumatate&lt;br /&gt;
    MergeSort( v, m + 1 , dr );        // ordonam a doua jumatate&lt;br /&gt;
&lt;br /&gt;
    int i = st, j = m + 1, k = 0;      // interclasam cele doua jumatati&lt;br /&gt;
    while( i &amp;lt;= m &amp;amp;&amp;amp; j &amp;lt;= dr )         // cata vreme mai am elemente in cele doua jumatati&lt;br /&gt;
      if( v[i] &amp;lt; v[j] )                // compar primele elemente&lt;br /&gt;
        tmp[k++] = v[i++];             // punem intr-un vector temporar valorile interclasate&lt;br /&gt;
      else&lt;br /&gt;
        tmp[k++] = v[j++];&lt;br /&gt;
    while( i &amp;lt;= m )                    // daca mi-au mai ramas valori in prima jumatate, le transfer in tmp&lt;br /&gt;
      tmp[k++] = v[i++];&lt;br /&gt;
    while( j &amp;lt;= dr )                   // daca mi-au ramas valori in a doua jumatate, le transfer in tmp&lt;br /&gt;
      tmp[k++] = v[j++];&lt;br /&gt;
&lt;br /&gt;
  j = 0 ;&lt;br /&gt;
  for(i = st;  i &amp;lt;= dr ; i ++ )      // punem valorile din tmp in v;&lt;br /&gt;
  v[i] = tmp[j++];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n ;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( int i = 0; i &amp;lt; n; ++i )&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[ i ];&lt;br /&gt;
&lt;br /&gt;
  MergeSort( v, 0, n - 1 );&lt;br /&gt;
&lt;br /&gt;
  for( int i = 0; i &amp;lt; n; ++i )&lt;br /&gt;
    cout &amp;lt;&amp;lt; v[ i ] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Turnurile din Hanoi ==&lt;br /&gt;
Fie tijele a, b, c, iar pe tija a n discuri. Sa se muta discurile de pe tija a pe tija b folosind tija intermediara c. Respectand regurile:&lt;br /&gt;
1. la fiecare pas se muta un singur disc &lt;br /&gt;
2.nu se poate muta un disc mare peste unul mic&lt;br /&gt;
&lt;br /&gt;
* Daca n = 1 se muta discul de pe a pe b; H(n,a,b,c)= ab&lt;br /&gt;
* Daca n = 2 mutam discul de pe : a pe c, a pe b, c pe b &lt;br /&gt;
Pentru n discuri:&lt;br /&gt;
Trebuie sa mut n-1 discuri de pe tija a pe tija c si discul n de pe tija a pe tija b.  Se muta a,b (discul care a ramas pe a), si mut n-1 discuri de pe c pe b prin tija intermediara a.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
void hanoi(int n,char a, char b, char c){&lt;br /&gt;
  if( n == 1 )&lt;br /&gt;
    cout &amp;lt;&amp;lt; a&amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;    // mut de pe tija a pe tija b singurul disc&lt;br /&gt;
  else{&lt;br /&gt;
    hanoi( n - 1, a, c, b );  // mut n-1 discuri de pe tija a pe tija c, prin intermediul tijei b&lt;br /&gt;
    cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;   // mut de pe tija a pe tija b singurul disc ramas&lt;br /&gt;
    hanoi( n - 1, c, b, a );  // mut n-1 discuri de pe tija c pe tija b, prin intermediul tijei a&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  int n;&lt;br /&gt;
  char a = &amp;#039;a&amp;#039;, b = &amp;#039;b&amp;#039;, c =&amp;#039;c&amp;#039;;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  hanoi( n, a, b, c );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TEMA = &lt;br /&gt;
usor&lt;br /&gt;
* https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1025 ( teorie )&lt;br /&gt;
mediu&lt;br /&gt;
* https://www.infoarena.ro/problema/mergesort&lt;br /&gt;
* https://infoarena.ro/problema/swap&lt;br /&gt;
* https://infoarena.ro/problema/password2&lt;br /&gt;
* http://varena.ro/problema/hanoi&lt;br /&gt;
grea&lt;br /&gt;
* http://cs.org.mk/jboi2013/en/tasks.html &amp;quot;Counting inversions&amp;quot; ( Propunere Tibi )&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>