Anar al contingut

Ordenament de bombeta

De L'Enciclopèdia, la wikipedia en valencià
Archiu:Sorting bubblesort anim.gif
Ordenament de bombeta
Archiu:Bubble-sort-example-300px.gif
Representació animada d'ordenació d'un conjunt de números per mig de l'algoritme bombeta. Començant des de l'inici de l'apany, es compara cada parell d'elements adjacents. Si abdós no estan ordenats (el segon és menor que el primer), s'intercanvien les seues posicions. En cada iteración, un element menys necessita ser evaluats (l'últim), ya que no hi ha més elements a la seua dreta que necessiten ser comparats, ya que ya estan ordenats.

El ordenament de bombeta (Bubble Sort en anglés) és un senzill algoritme d'ordenament. Funciona revisant cada element de la llista que va a ser ordenada en el següent, intercanviant-los de posició si estan en l'orde equivocat. És necessari revisar vàries voltes tota la llista fins que no es necessiten més intercanvis, la qual cosa significa que la llista està ordenada. Este algoritme obté el seu nom de la forma en la que pugen per la llista els elements durant els intercanvis, com si anaren chicotetes «bombetes». També és conegut com el método de l'intercanvi directe. Ya que solament usa comparacions per a operar elements, li'l considera un algoritme de comparació, sent un dels més senzills d'implementar.

Descripció

[editar | editar còdic]

Una manera simple d'expressar l'ordenament de bombeta en pseudocódigo és la següent:

𝑝𝑟𝑜𝑐𝑒𝑑𝑖𝑚𝑖𝑒𝑛𝑡𝑜𝐷𝑒𝐿𝑎𝐵𝑢𝑟𝑏𝑢𝑗𝑎(𝑎0,𝑎1,𝑎2,,𝑎(𝑛1))
𝑝𝑎𝑟𝑎𝑖1𝑎𝑠𝑡𝑎𝑛1𝑎𝑐𝑒𝑟
𝑝𝑎𝑟𝑎𝑗0𝑎𝑠𝑡𝑎𝑛𝑖𝑎𝑐𝑒𝑟
𝑠𝑖𝑎(𝑗)>𝑎(𝑗+1)𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠
𝑎𝑢𝑥𝑎(𝑗)
𝑎(𝑗)𝑎(𝑗+1)
𝑎(𝑗+1)𝑎𝑢𝑥
𝑓𝑖𝑛𝑠𝑖
𝑓𝑖𝑛𝑝𝑎𝑟𝑎
𝑓𝑖𝑛𝑝𝑎𝑟𝑎
𝑓𝑖𝑛𝑝𝑟𝑜𝑐𝑒𝑑𝑖𝑚𝑖𝑒𝑛𝑡𝑜

Este algoritme realisa l'ordenament o reordenamiento d'una llista a de n valores, en este cas de n térmens numerats del 0 al n-1; consta de dos bucles anidados, un en l'índex i, que dona un tamany menor al recorregut de la bombeta en sentit invers de 2 a n, i un segon bucle en l'índex j, en un recorregut des de 0 fins a n-i, per a cada iteración del primer bucle, que indica el lloc de la bombeta.

La bombeta són dos térmens de la llista seguits, j i j+1, que es comparen: si el primer és major que el segon els seus valors s'intercanvien.

Esta comparació es repetix en el centre dels dos bucles, donant lloc a una llista ordenada. Pot vore's que el número de repeticions solament depén de n i no de l'orde dels térmens, açò és, si passem a l'algoritme una llista ya ordenada, realisarà totes les comparacions exactament igual que per a una llista no ordenada. Esta és una característica d'este algoritme. Després vorem una variant que evita este inconvenient.

Per a comprendre el funcionament, vejam un eixemple senzill:

Tenim una llista de números que cal ordenar:

a={55,86,48,16,82}
a4=82a3=16a2=48a1=86a0=55

Podem vore que la llista que té cinc térmens, després:

n=5

L'índex i farà un recorregut de 2 fins a n:

𝑝𝑎𝑟𝑎𝑖2𝑎𝑠𝑡𝑎𝑛𝑎𝑐𝑒𝑟

que en este cas serà de 2 a 5. Per a cada u dels valors de i, j prendrà successivament els valors de 0 fins a n-i:

𝑝𝑎𝑟𝑎𝑗0𝑎𝑠𝑡𝑎𝑛𝑖𝑎𝑐𝑒𝑟

Per a cada valor de j, obtingut en eixe orde, es compara el valor de l'índex j en el següent:

𝑠𝑖a(j)>a(j+1)𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠

Si el terme j és major que el terme j+1, els valors es permuten, en cas contrari es continua en la iteración.

j=0j=1j=2j=3a48282828286a31616168682a24848861616a18686484848a05555555555

Per al cas de l'eixemple, tenim que:

n=5

Per a la primera iteración del primer bucle:

i=2

i j prendrà els valors de 0 fins a 3:

𝑝𝑎𝑟𝑎𝑗0𝑎𝑠𝑡𝑎3𝑎𝑐𝑒𝑟

Quan j val 0, es comparen a0a1, el 55 i el 86, ya que 55 < 86, no es permuta l'orde.

Ara j val 1 i es comparen a1a2 el 86 i el 48. Com 86 > 48, es permuten, donant lloc a una nova llista.

Es repetix el procés fins que j valga 3, donant lloc a una llista parcialment ordenada. Podem vore que el terme de major valor està en el lloc més alt.

j=0j=1j=2a486868686a382828282a216165555a148551616a055484848

Ara i val 3, i j farà un recorregut de 0 a 2.


Primer j val 0, es comparen a0a1, el 55 i el 48. Com 55 > 48 es permuten donant lloc a la nova llista.

Per a j = 1 es compara el 55 en el 16 i es canvien d'orde.

Per a j = 2 es compara el 55 i el 82 i es deixen com estan, finalisant el bucle en una llista millor ordenada. Pot vore's que els dos valors més alts ya ocupen el seu lloc. No s'ha realisat cap comparació en el terme quart, ya que ya se sap que despuix del primer cicle és el major de la llista.

L'algoritme consistix en comparacions successives de dos térmens consecutius ascendint d'avall dalt en cada iteración, com l'ascensió de les bombetes d'aire en l'aigua, d'ahí el nom del procediment. En la primera iteración el recorregut ha segut complet, en el segon s'ha deixat l'últim terme, en tindre ya el major dels valors; en els successius s'anirà deixant de realisar les últimes comparacions, com es pot vore.

j=0j=1a4868686a3828282a2555555a1164848a0481616

Ara ya i val 4 i j recorrerà els valors de 0 a 1.

Quan j val 0, es comparen a0a1, açò és, el 48 i el 16. Ya que 48 és major que 16 es permuten els valors, donant lloc a una llista alguna cosa més ordenada que l'anterior. Des d'esta nova ordenació, j passa a valdre 1, en lo que es comparen els térmens a1a2 el 48 i el 55 que queden en el mateix orde.

En este cas la bombeta ha ascendit menys que en els casos anteriors, i la llista està ya ordenada, pero l'algoritme tindrà que completar-se, realisant una última iteración.

Cal tindre en conte que el bucle realisa un número fix de repeticions i per a finalisar tindran que completar-se, encara en el cas extrem, de que la llista estiguera prèviament ordenada.

Per últim i val 5 i j solament pot val 0, en lo que només es realisarà una comparació de a0a1 el 16 i el 48, que ya estan ordenats i es deixen igual.

j=0a48686a38282a25555a14848a01616

Els bucles finalisen i també el procediment, deixant la llista ordenada.

Una variant que finalisa en cas que la llista estiga ordenada, pot ser la següent: com en l'eixemple anterior, amprant un centinela ordenat, que detecta que no s'ha modificat la llista en un recorregut de la bombeta, i que per tant la llista ya està ordenada, finalisant immediatament.

procedimientoDeLaBurbuja2(a(0),a(1),a(2),,a(n1))
i1
ordenadono
𝑚𝑖𝑒𝑛𝑡𝑟𝑎𝑠(𝑖<𝑛)(𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑜=𝑛𝑜)𝑎𝑐𝑒𝑟
ii+1
ordenadosi
𝑝𝑎𝑟𝑎𝑗0𝑎𝑠𝑡𝑎𝑛𝑖𝑎𝑐𝑒𝑟
𝑠𝑖a(j)>a(j+1)𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠
ordenadono
auxa(j)
a(j)a(j+1)
a(j+1)aux
𝑓𝑖𝑛𝑠𝑖
𝑓𝑖𝑛𝑝𝑎𝑟𝑎
𝑓𝑖𝑛𝑚𝑖𝑒𝑛𝑡𝑟𝑎𝑠
𝑓𝑖𝑛𝑝𝑟𝑜𝑐𝑒𝑑𝑖𝑚𝑖𝑒𝑛𝑡𝑜
procedimientoDeLaBurbuja3(a(0),a(1),a(2),,a(n1))
i1
𝑟𝑒𝑝𝑒𝑡𝑖𝑟
ii+1
ordenadosi
𝑝𝑎𝑟𝑎𝑗0𝑎𝑠𝑡𝑎𝑛𝑖1𝑎𝑐𝑒𝑟
𝑠𝑖a(j)>a(j+1)𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠
ordenadono
auxa(j)
a(j)a(j+1)
a(j+1)aux
𝑓𝑖𝑛𝑠𝑖
𝑓𝑖𝑛𝑝𝑎𝑟𝑎
𝑎𝑠𝑡𝑎𝑞𝑢𝑒¬(𝑖<𝑛)(𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑜=𝑠𝑖)
𝑓𝑖𝑛𝑝𝑟𝑜𝑐𝑒𝑑𝑖𝑚𝑖𝑒𝑛𝑡𝑜

Anàlisis

[editar | editar còdic]
Eixemple de l'ordenament de bombeta ordenant una llista de números aleatoris.
Eixemple de l'ordenament de bombeta ordenant una llista de números aleatoris.

Rendiment de l'algoritme

[editar | editar còdic]

AP

A l'algoritme de la bombeta, per a ordenar un apany de n térmens, té que realisar sempre el mateix número de comparacions:

c(n)=n2n2

Açò és, el número de comparacions c(n) no depén de l'orde dels térmens, si no del número de térmens:

Θ(c(n))=n2

Per lo tant la cota ajustada asintòtica del número de comparacions pertany a l'orde de n quadrat.

El número d'intercanvis i(n), que cal realisar depén de l'orde dels térmens i podem diferenciar, el cas millor, si l'apany està prèviament ordenat, i el cas pijor, si l'apany està ordenat en orde invers:

Θ(i(n))=?

Per lo que no es pot determinar una cota ajustada asintòtica del número d'intercanvis, ya que este dependrà de l'orde de l'apany en qüestió.

Rendiment en el cas desfavorable

[editar | editar còdic]

AP Si passem a l'algoritme un apany ordenat en orde invers realisarà un número de comparacions:

c(n)=n2n2


Com ya hem dit anteriorment, i tindrà que realisar un número igual d'intercanvis entre els térmens de l'apany, ya que en cada comparació els térmens estaran desordenats, i es realisarà l'intercanvi.

i(n)=n2n2

Per lo tant en el cas més desfavorable tant el número de comparacions com el d'intercanvis coincidixen:

O(c(n))=O(i(n))=n2

El número de comparacions o d'intercanvis en el cas més desfavorable pertany a l'orde de n quadrat.

Rendiment en casos òptims

[editar | editar còdic]

AP

En el cas òptim, el més favorable, és l'ordenació d'un apany ya ordenat. En este cas el número de comparacions serà el mateix que en qualsevol atre cas:

Ω(c(n))=n2

La cota inferior asintòtica del número de comparacions pertany a l'orde de n quadrat, com en els demés casos, pero en totes les comparacions l'orde és el correcte i per tant no es realisa cap intercanvi:

i(n)=0

Per lo tant el cost d'intercanvis no depén de n, i és constant:

Ω(i(n))=1

L'ordenament de bombeta té una complexitat Ω(n²) igual que ordenament per selecció. Quan una llista ya està ordenada, a diferència del ordenament per inserció que passarà per la llista una volta i trobarà que no hi ha necessitat d'intercanviar les posicions dels elements, el método d'ordenació per bombeta està forçat a passar per dites comparacions, lo que fa que la seua complexitat siga quadràtica en el millor dels casos. Açò ho cataloga com un dels algoritmes d'ordenació més ineficientes que existixen, encara que para molts programadors siga el més senzill d'implementar.

Referències

[editar | editar còdic]

Vore també

[editar | editar còdic]