{"id":590,"date":"2014-12-31T12:57:48","date_gmt":"2014-12-31T11:57:48","guid":{"rendered":"http:\/\/www.valcon.it\/pascal\/?p=590"},"modified":"2015-07-03T13:20:10","modified_gmt":"2015-07-03T11:20:10","slug":"bubble-sort","status":"publish","type":"post","link":"https:\/\/www.valcon.it\/pascal\/bubble-sort\/","title":{"rendered":"Bubble Sort"},"content":{"rendered":"<p>Algoritmo molto diffuso perch\u00e9 intuitivo <em>ma con prestazioni scadenti<\/em>.<\/p>\n<h3><img decoding=\"async\" class=\"right alignright\" title=\"Una passata\" src=\"http:\/\/www.valcon.it\/pp\/wp-content\/uploads\/bs0.png\" alt=\"Una passata\" \/>Una passata<\/h3>\n<p>Una passata con <a title=\"Ordinare due dati\" href=\"http:\/\/www.valcon.it\/pascal\/ordinare-due-dati\/\">ordinamenti di due elementi<\/a> su tutte le <strong>n-1<\/strong> coppie, all&#8217;interno di un array, provoca lo spostamento <em>in alto<\/em> della <em>bolla<\/em> pi\u00f9 grande.<\/p>\n<p>Sia<\/p>\n<p style=\"padding-left: 30px;\">V=(20, 15, 10, 3)<\/p>\n<p>alla fine della passata l&#8217;elemento pi\u00f9 grande <strong>20<\/strong> si trova in ultima posizione<\/p>\n<p style=\"padding-left: 30px;\">V=(15, 10, 3, <strong>20<\/strong>)<\/p>\n<pre class=\"\">For j:=1 To N-1 Do\r\n   If(V[j] > V[j+1]) Then\r\n      SCAMBIA(V[j], V[j+1]);<\/pre>\n<h3>Bubble sort<\/h3>\n<p><strong>N<\/strong> passate, sulle <strong>n-1<\/strong> coppie, ordinano sicuramente l&#8217;array<\/p>\n<pre class=\"\">Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   i, j: Integer;\r\nBegin\r\n   For i:=1 To N Do\r\n      For j:=1 To N-1 Do\r\n         If(V[j] > V[j+1]) Then\r\n            SCAMBIA(V[j], V[j+1]);\r\nEnd;<\/pre>\n<p>In realt\u00e0 sono necessarie al massimo <strong>N-1<\/strong> passate su <strong>N-i<\/strong> coppie (di ciascuna passata)<\/p>\n<pre class=\"\">Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   i, j: Integer;\r\nBegin\r\n   For i:=1 To N-1 Do\r\n      For j:=1 To N-i Do\r\n         If(V[j] > V[j+1]) Then\r\n            SCAMBIA(V[j], V[j+1]);\r\nEnd;<\/pre>\n<p>Osserva,,,<\/p>\n<p style=\"padding-left: 30px;\"><img decoding=\"async\" class=\"right\" title=\"Bubble Sort\" src=\"http:\/\/www.valcon.it\/pp\/wp-content\/uploads\/bs1.png\" alt=\"Bubble Sort\" \/><\/p>\n<h3>Miglioramenti?<\/h3>\n<p>Nel caso in cui il vettore risulti ordinato dopo un certo numero di passate \u00e8 possibile interrompere l&#8217;esecuzione del <strong>While()\u00a0<\/strong>introducendo la variabile <strong>ANCORA<\/strong><\/p>\n<pre>Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   ANCORA: Boolean;\r\n   i, j  : Integer;\r\nBegin\r\n   i:=1;\r\n   ANCORA:=True;\r\n   While(i < N) And (ANCORA) Do\r\n      Begin\r\n         ANCORA:=False;\r\n         For j:=1 To N-i Do\r\n            If(V[j] > V[j+1]) Then\r\n               Begin\r\n                  SCAMBIA(V[j], V[j+1]);\r\n                  ANCORA:=True;\r\n               End;\r\n         Inc(i);\r\n      End;\r\nEnd;<\/pre>\n<p>Il numero di passate dipende solo da <strong>ANCORA<\/strong><\/p>\n<pre>Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   ANCORA: Boolean;\r\n   i, j  : Integer;\r\nBegin\r\n   i:=1;\r\n   ANCORA:=True;\r\n   While(ANCORA) Do\r\n      Begin\r\n         ANCORA:=False;\r\n         For j:=1 To N-i Do\r\n            If(V[j] > V[j+1]) Then\r\n               Begin\r\n                  SCAMBIA(V[j], V[j+1]);\r\n                  ANCORA:=True;\r\n               End;\r\n         Inc(i);\r\n      End;\r\nEnd;<\/pre>\n<p>Se la variabile <strong>ANCORA<\/strong> non interviene si ha una passata in pi\u00f9.<\/p>\n<p>Elimino la differenza <strong>N-i<\/strong><\/p>\n<pre>Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   ANCORA      : Boolean;\r\n   UltimaCoppia,\r\n   j           : Integer;\r\nBegin\r\n   ANCORA:=True;\r\n   UltimaCoppia:=N-1;\r\n   While(Ancora) Do\r\n      Begin\r\n         ANCORA:=False;\r\n         For j:=1 To UltimaCoppia Do\r\n            If(V[j] > V[j+1]) Then\r\n               Begin\r\n                  SCAMBIA(V[j], V[j+1]);\r\n                  ANCORA:=True;\r\n               End;\r\n         Dec(UltimaCoppia);\r\n      End;\r\nEnd;<\/pre>\n<p>La lunghezza del vettore dipende da <strong>UltimoScambio<\/strong> piuttosto che da <strong>UltimaCoppia<\/strong><\/p>\n<pre>Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   ANCORA       : Boolean;\r\n   UltimaCoppia , \r\n   UltimoScambio, \r\n   i            : Integer;\r\nBegin\r\n   ANCORA:=True;\r\n   UltimaCoppia:=N-1;\r\n   While(ANCORA) Do\r\n      Begin\r\n         ANCORA:=False;\r\n         UltimoScambio:=1;\r\n         For i:=1 To UltimaCoppia Do\r\n            If(V[i] > V[i+1]) Then\r\n               Begin\r\n                  SCAMBIA(V[i], V[i+1]);\r\n                  ANCORA:=True;\r\n                  UltimoScambio:=i;\r\n               End;\r\n         UltimaCoppia:=UltimoScambio-1;\r\n      End;\r\nEnd;<\/pre>\n<p>In questo modo le passate diventano pi\u00f9 corte.<\/p>\n<p>Il <strong>While&#8230;Do<\/strong> esterno diventa <strong>Repeat&#8230;Until<\/strong><\/p>\n<pre>Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   UltimaCoppia , \r\n   UltimoScambio, \r\n   i            : Integer;\r\n   FINITO       : Boolean;\r\nBegin\r\n   UltimaCoppia:=N-1;\r\n   Repeat\r\n      FINITO:=True;\r\n      UltimoScambio:=1;\r\n      For i:=1 To UltimaCoppia Do\r\n         If(V[i] > V[i+1]) Then\r\n            Begin\r\n               SCAMBIA(V[i], V[i+1]);\r\n               FINITO:=False;\r\n               UltimoScambio:=i;\r\n            End;\r\n      UltimaCoppia:=UltimoScambio-1;\r\n   Until(FINITO);\r\nEnd;<\/pre>\n<p>Elimino la variabile <strong>FINITO<\/strong><\/p>\n<pre>Procedure BUBBLESORT(Var V: Vettore; N: Integer);\r\nVar\r\n   UltimaCoppia ,\r\n   UltimoScambio,\r\n   i            : Integer;\r\nBegin\r\n   UltimaCoppia:=N-1;\r\n   Repeat\r\n      UltimoScambio:=1;\r\n      For i:=1 To UltimaCoppia Do\r\n         If(V[i] > V[i+1]) Then\r\n            Begin\r\n               SCAMBIA(V[i], V[i+1]);\r\n               UltimoScambio:=i;\r\n            End;\r\n      UltimaCoppia:=UltimoScambio-1;\r\n   Until(UltimoScambio = 1);\r\nEnd;<\/pre>\n<hr\/>\n<p>L&#8217;istruzione <tt>SCAMBIA()<\/tt> viene eseguita ogni volta che ha successo\u00a0il controllo dell&#8217;istruzione <tt>If(...) Then<\/tt>.<br \/>\nConsideriamo il caso pessimo, cio\u00e8 che succeda a ogni passo.<br \/>\nQuanti sono i controlli e le esecuzioni di <tt>SCAMBIA()<\/tt>?<\/p>\n<div class=\"indent\">\n<table class=\"data\">\n<tbody>\n<tr align=\"center\">\n<td><em>i<\/em><\/td>\n<td><em>j<\/em><\/td>\n<td><em>T<sub>C<\/sub><\/em><\/td>\n<td><em>T<sub>S<\/sub><\/em><\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>1&#8230;n-1<\/td>\n<td>n-1<\/td>\n<td>n-1<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>1&#8230;n-2<\/td>\n<td>n-2<\/td>\n<td>n-2<\/td>\n<\/tr>\n<tr>\n<td>&#8230;<\/td>\n<td>&#8230;<\/td>\n<td>&#8230;<\/td>\n<td>&#8230;<\/td>\n<\/tr>\n<tr>\n<td>n-2<\/td>\n<td>1&#8230;(n-(n-2))<br \/>\n1&#8230;2<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>n-1<\/td>\n<td>1&#8230;(n-(n-1))<br \/>\n1&#8230;1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Quindi<\/p>\n<div class=\"indent\" style=\"padding-left: 30px;\"><tt>T<sub>C<\/sub>(n)=T<sub>S<\/sub>(n)=(n-1)+(n-2)+...+1<\/tt>.<\/div>\n<p>Quanto vale la somma?<br \/>\nSappiamo che <tt>1+2+...n=n(n+1)\/2<\/tt> e quindi<\/p>\n<div class=\"indent\" style=\"padding-left: 30px;\"><tt>T(n)=(n-1)n\/2=\u00bdn<sup>2<\/sup>-\u00bdn<\/tt>.<\/div>\n<p>La complessit\u00e0 in tempo asintotica dell&#8217;algoritmo di ordinamento Bubble Sort \u00e8 <strong>O(n<sup>2<\/sup>)<\/strong>, sia per il numero di <strong>confronti<\/strong> che per il numero di <strong>scambi<\/strong>.<\/p>\n<p>Nel <strong>caso ottimo<\/strong>, il vettore gi\u00e0 ordinato, il numero di scambi \u00e8 <strong>0<\/strong> ma rimane quadratico il numero di confronti.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Algoritmo molto diffuso perch\u00e9 intuitivo ma con prestazioni scadenti. Una passata Una passata con ordinamenti di due elementi su tutte le n-1 coppie, all&#8217;interno di un array, provoca lo spostamento in alto della bolla pi\u00f9 grande. Sia V=(20, 15, 10, 3) alla fine della passata l&#8217;elemento pi\u00f9 grande 20 si trova in ultima posizione V=(15, &#8230; <a title=\"Bubble Sort\" class=\"read-more\" href=\"https:\/\/www.valcon.it\/pascal\/bubble-sort\/\" aria-label=\"Leggi di pi\u00f9 su Bubble Sort\">Leggi tutto<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"_links":{"self":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts\/590"}],"collection":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/comments?post=590"}],"version-history":[{"count":9,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":5656,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/posts\/590\/revisions\/5656"}],"wp:attachment":[{"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/media?parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/categories?post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.valcon.it\/pascal\/wp-json\/wp\/v2\/tags?post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}