Sei sulla pagina 1di 13

Algoritmi Pagina 1

Spiegazione dell'algoritmo nel dettaglio: Si parla di un algor iterat, che ordina 1 array di n elementi. L'algor impiega 2 funz, 1 principale ed 1 di appoggio, la cui funz appunto quella di scamb la posiz di d2 elem dell'array. Alla funzione SelectionSort vengono passati due argomenti, un puntatore all'array, ed un valore che corrisponde al numero di elementi dell'array. L'array possiede 2 cicli for uno interno all'altro. Il primo ciclo for serve per scalare gli elementi dell'array gi ordinati in modo da poterli ignorare, inoltre serve ad assegnare il valore dell'indice dell'array ad una variabile chiamiamola 'min' che di volta in volta andr ad indicare l'indice del valore minimo contenuto nella parte dell'array in cui sto cercando. La ricerca avviene tramite il secondo for che scorre partendo dall'indice immediatamente successivo a quello indicato da 'min'. All'interno del secondo for si ha quindi un confronto imposto come condizione di un istruzione if che di volta in volta confr il val conten nella locaz indicata da min e quella indic dal val del 2 for al momento del confr per capire quale dei 2 val sia il minore. Se il valore localizzato tramite l'indice min non il minore tra i 2, allora tramite la funzione di appoggio si effettua lo scambio di valori nelle locazioni individuate dai 2 indici. Funz di appoggio exchange: A questa funz vengono passati per riferimento gli indirizzi delle 2 locaz dell'array, la funz tramite una var d'appoggio effetua un semplice riassegnamento di val alle 2 locaz. La compl dell'algor O(n^2)

Spiegazione nel dettaglio di Bubblesort ricorsiva: La funzione mantiene la sua struttura semplice, essendo ricorsiva, rispetto a quella iterativa perde un ciclo for, inoltre si avvale di una funzione di "supporto" chiamata exchange Alla funzione vengono passati come argomenti: l'indiriz dell'array tramite punt, il num di elem "n" dell'array e l'indice "i" con valore iniziale 0, grazie a
qst var possibile eliminare un for, in quanto la funzione termina nel caso baso solo quando i=n-1, questo caso base racchiude al suo interno l'intero codice della funz, ecco perch quando viene raggiunto il caso base la funz termina. Per prima cosa viene creata 1 var conten lo stesso val dell'indice i.Il ciclo for inizia dalla locaz succ a i.

Spiegazione nel dettaglio dell'algoritmo BubbleSort: Alla funz BubbleSort vengono passati come arg l'indiriz dell'array tramite punt ed il numero di elem dell'array. La funzione fa uso di 1 funz di "supporto" ma molto semplice dal punto di vista strutturale, in quanto BubbleSort contiene 2 cicli for uno interno all'altro dei quali qll + interno scorre "velocemente" l'array. All'interno del 2 ciclo for si presenta una condizione if che viene sempre considerata, questa impone il confronto tra la locaz dell'array con indice = a qll attuale del for e qll in posiz precedente, in particolare se accade che qll in posz prec maggiore allora si effettua uno scambio di valori tra le locaz individuate dall'indice att del for e lo stesso indice decrementato di 1, lo scambio avviene tramite la funz exchange. Funz di appoggio exchange: A questa funz vengono passati per riferimento gli indirizzi delle 2 locaz dell'array, la funz tramite una var d'appoggio effetua un semplice riassegnamento di val alle 2 locaz. La compl dell'algor O(n^2) All'interno del ciclo for si presenta una condizione if che viene sempre considerata, questa impone il confronto tra la locaz dell'array con indice = a qll attuale del for e qll in posiz precedente, in particolare se accade che qll in posz prec maggiore allora si effettua uno scambio di valori tra le locaz individuate dall'indice att del for e lo stesso indice decrementato di 1, lo scambio avviene tramite la funz exchange. Una volta avvenuto lo scambio, la funzione BubbleSort viene richiam ricors con l'indice i incremen di 1. Funz di appoggio exchange: A questa funz vengono passati per riferimento gli indirizzi delle 2 locaz dell'array, la funz tramite una var d'appoggio effetua un semplice riassegnamento di val alle 2 locaz. La compl dell'algor O(n^2)

Algoritmi Pagina 2

Viene creato 1 punt a NULL dello stesso tipo di list 1(Elem) che chiamo list2 e viene poi chiam la funz split con argom list1 e list2 (passati come punt a rif). La funz split per 1 cosa effettua 1 contr per verif se la lista passata come 1 argom vuota, o composta da 1 solo elem, in caso 1 di queste 2 possib si verif, la funz termina con 1 istruz return. Passato questo controllo viene creato 1 punt ausiliario che chiamo p, dello stesso tipo della lista (Elem) al quale si passa lindirizzo del prox elem (qllin pos pari) di list1, e list1 tramite il punt si aggancia allelem immediat succ a qll punt da p, in questo modo list1 punta cio al 1 elemento pari di list1 saltando il primo dispari. Fatto ci il punt dellelem della list a cui punta p, va a puntare lindirizzo a cui punta list2, che alla 1 esecuz di split il val NULL, dopodich list2 punta allindiriz puntato da p. Poi viene chiam ricors split alla quale vengono pass come argom il prox elem di list1 (quindi il prox in posiz dispari risp alla lista) e list2. In soldoni split finisce la sua ricors qnd la lis1 stata divisa in 2 parti circa =. A qust pt riprende lesecuz di mergesort che richiama se stessa ricorsiv passando list1 splittata ovvero la met di list1 come argom di funz . Molto sinteticamente mergesort effettua le stesse operaz di cui ho parlato sopra ma su 1 lista grande qnt la met di prima, in questo modo mergesort divide ogni 1 met della lista in 2 parti fino a qnd lultima ricors di mergesort non ragg il caso base. A questo pnt ho che gli tt gli elem della prima met di list1 sono liste di 1 elem. A qst pnt riprende lesecuiz di mergesort nella ricors immediat prec che richiama se stessa ricors ma su list2 che sar ancora una lista comp da 1 elem, cosicch mergesort termina e si torna a 1 sua ricors prec che rich se stessa su unaltra fraz della lista princ divid anche qui fino ad arriv ancora ad avere liste da 1 elem. Quando mergesort ha finito le chiamate ricorsive su se stessa, la list principale sar nella sua ultima ricors, 1 list da 1 elem ed a qst punt lesecuz in qst ricors riprende chiamando la funz merge e pass come arg list1 e list2 (come punt a rif). La funz merge si occupa della parte fin dellalgo. La funz per prima cosa ctrl se list1=NULL in caso affermativo list1 prende list2 (che alla 1 esec di merge di 1 solo elem) e la funz termina con 1 return . In caso contrario si passa a un 2 ctrl, se list2=NULL la funz termina con 1 return. Nel caso venga super anche qst ctrl ne subentra un altro e se linf nellelem punt da list1 <= dellinf dellelem punt da list2=> lelem di list1 gi in ordine(su questa porzione di list1) e qnd viene rich ricors merge con argom il prox elem d list1 e con list2 e cosi ricomincia lesecuz di merge, se per la condiz non viene risp vuol dire che linf nellelem punt da list1 > dellinf dellelem punt da list2=> si richiama ricors merge, qst volta con list2 come primo argom perch rispetta lordine, ogni volta che per finisce la ricors di questo caso list1 prende list2 qst perch le liste sono state scambiate come argom di merge. Questa fun ricade sempre in uno dei 2 casi base ovviam e qst gli consente di lavorare su una ricors prec e qnd su altre due porz + grandi della list princ ma gia ordin e qnd merge pu essere eseguita corret anche su porzioni + grandi. Il processo naturalmente viene portato avanti ricors fino a che la lista originale nn viene ricomposta ed in questo caso la funz ha termine perch si ricade nella prima mergesort che ha generato tt l'algoritmo che essendo 1 funz void e nn avendo altre istruz success termina.

Spiegazione dettagliata dell'algoritmo MergeSort: Chiamata a mergesort con passaggio di list1 come rif a punt Controlla se list1 vuota o contiene un solo elem esci dalla funzione Crea una lista list2 vuota (lista di appoggio) Chiamata split con passaggio di list1 e list2 Chiamata a mergesort ricorsiva passando list1 (frazione di list1 orig) Chiamata a mergesort ricorsiva passando list2 (frazione di list1 orig) Chiamata a merge passando list1 e list2 (frazioni di list1 orig) Chiamata a split passando list1 e list2 come rif a punt Controlla se list1 vuota o contiene un solo elem esci dalla funzione Crea puntatore elem inizializz con elem posiz pari list1 List1 prende elem in posiz disp di se stessa L prende elem a cui punta list2 che prende qll a cui punta l (cio tt) Chiamata ricors a split passando list1 pos dispari e list2 Chiamata a merge con list1,list2 punt a rif se list1 vuota=>list1 prende tt list2 e fine funz Se list2 vuota=> fine funz Se l'etic elem list1<=etic elem list2 chiama merge con elem suc list1 e list2 Altrimenti chiama merge con list2 elem suc e list 1 List1 prende list2

Mergesort 1 funz ricors che si avvale di 2 funz di supporto che si chiamano split e merge. Lalgor si pu appl sia a liste che ad array ma parler della versione che lavora su liste.. 1 volta che mergesort viene chiamata (con pass di arg come rif a punt), per 1 cosa la funz effettua 1 controllo per verif se la lista passata che chiamo list1 (per comodit) vuota, oppure composta da 1 solo elemento, se una di queste 2 condizioni si avvera allora lesecuz della funz diventa obsoleta e quindi la funz termina con 1 istruz return (in quanto non ha senso eseguire un ordin su 1 lista composta da 1 solo elem e tanto meno su 1 lista vuota).

Algoritmi Pagina 3

Algoritmi Pagina 4

Algoritmi Pagina 5

Algoritmi Pagina 6

Algoritmi Pagina 7

Riporto il 6.1:

Algoritmi Pagina 8

Algoritmi Pagina 9

Algoritmi Pagina 10

Algoritmi Pagina 11

Ritaglio schermo acquisito: 03/04/2013 10:20

Ritaglio schermo acquisito: 03/04/2013 10:20

Algoritmi Pagina 12

Ritaglio schermo acquisito: 03/04/2013 10:19

Ritaglio schermo acquisito: 03/04/2013 10:19

Ritaglio schermo acquisito: 03/04/2013 10:18

Ritaglio schermo acquisito: 03/04/2013 10:17

Ritaglio schermo acquisito: 03/04/2013 10:16

Ritaglio schermo acquisito: 03/04/2013 10:16

Ritaglio schermo acquisito: 03/04/2013 10:15

Ritaglio schermo acquisito: 03/04/2013 10:15

Ritaglio schermo acquisito: 03/04/2013 10:14

Ritaglio schermo acquisito: 03/04/2013 10:14

Ritaglio schermo acquisito: 03/04/2013 10:12

Ritaglio schermo acquisito: 03/04/2013 10:12

Ritaglio schermo acquisito: 03/04/2013 10:11

Ritaglio schermo acquisito: 03/04/2013 10:11

Ritaglio schermo acquisito: 03/04/2013 10:10

Ritaglio schermo acquisito: 03/04/2013 10:10

Algoritmi Pagina 13