300 likes | 741 Views
ALGORITMOS DE ORDENAMIENTO. Compilado del texto de: Fernando Lagos B. por Corina Flores. Indice. 1 Introducción 2 Tipos de Algoritmos 2.1 Algoritmos iterativos 2.2 Algoritmos recursivos 3 Método de la Burbúja 3.1 Burbúja Símple 3.2 Burbúja Mejorada
E N D
ALGORITMOS DE ORDENAMIENTO Compilado del texto de: Fernando Lagos B. porCorina Flores
Indice 1 Introducción 2 Tipos de Algoritmos 2.1 Algoritmositerativos 2.2 Algoritmosrecursivos 3 Método de la Burbúja 3.1 BurbújaSímple 3.2 BurbújaMejorada 3.3 BurbújaÓptimizada 4 Insercionyselección 5 OrdenamientoporMezcla 6 MétodoShellsort 7 MétodoRápido (quicksort) 8 Complejidad
1. Introducción • Los algoritmos de ordenamientonospermite, comosunombre lo dice, ordenar.Porejemploelementosdispuestosya sea en arreglos, matrices olistas con valoresasignadosaleatoriamente. • Noscentraremos en los métodosmáspopulares, analizando la cantidad de comparacionesquesuceden, el tiempoquedemorayrevisando el código, escrito en Java, de cadaalgoritmo. Este material nospermitiráconocermas a fondocadametododistinto de ordenamiento, desdeuno simple hasta el mascomplejo. • Se realizarancomparaciones en tiempo de ejecucion, pre-requisitos de cadaalgoritmo, funcionalidad, alcance, etc.
2. Tipos de Algoritmos • Para poderordenarunacantidaddeterminada de numerosalmacenadosen unarregloomatriz, existendistintosmétodos(algoritmos) con distintascaracterísticasycomplejidad. • Existedesde el métodomas simple, como el Bubblesort (oMétodoBurbúja), que son simples iteraciones, hasta el Quicksort (MétodoRápido), que al estaroptimizadousandorecursión, sutiempo de ejecucionesmenoryesmásefectivo.
Estosmétodosson simples de entendery de programaryaque son iterativos, simples ciclosysentenciasquehacenque elarreglopuedaser ordenado. Dentro de los Algoritmositerativosencontramos: • Burbuja • Inserción • Selección • Shellsort
MétodosRecursivos • Estosmétodosson aúnmascomplejos, requieren de mayor atenciónyconocimientopara ser entendidos. Son rápidosyefectivos, utilizangeneralmente la técnicaDivide yvencerás, queconsiste en dividir un problemagrande en variospequeñosparaque sea másfácilresolverlos. • Mediantellamadasrecursivas a simismos, esposibleque el tiempo de ejecucióny de ordenación sea másoptimo. Dento de los algoritmosrecursivosencontramos: • OrdenamientoporMezclas (merge) • OrdenamientoRápido (quick)
Métodode la Burbuja • El métodode la burbujaesuno de los mas simples, es tan fácilcomocomparartodos los elementos de unalista contra todos, si se cumplequeunoes mayor omenor a otro, entonces los intercambia de posición. • Porejemplo, imaginemosquetenemos los siguientesvalores: 5 6 1 0 3 Lo quehariaunaburbuja simple, seriacomenzarrecorriendo los valores de izq. a derecha, comenzandopor el 5. Lo compara con el 6, con el 1, con el 0 y con el 3, sies mayor omenor (dependiendosi el ordenesascendienteodescendiente) se intercambian de posición. Luegocontinua con el siguiente, con el 6, y lo compara con todos los elementos de la lista, esperandoversi se cumpleo no la mismacondiciónque con el primer elemento. Asi, sucesivamente, hasta el ultimo elemento de la lista.
Burbuja Simple • Como lo describimos en el item anterior, la burbujamas simple de todases la quecomparatodos con todos, generandocomparaciones extras, porejemplo, no tienesentidoque se compare consigomismooque se compare con los valoresanteriores aél, yaquesupuestamente, yaestanordenados. for (i=1; i<LIMITE; i++) for j=0 ; j<LIMITE - 1; j++) if (vector[j] > vector[j+1]) temp = vector[j]; vector[j] = vector[j+1]; vector[j+1] = temp;
BurbujaMejorada • Unanueva version del métodode la burbujaserialimitando el númerode comparaciones, dijimosque era inutilque se compare consigomisma. • Si tenemosunalista de 10.000 elementos, entonces son 10.000 comparacionesqueestansobrando. • Imaginemossitenemos 1.000.000 de elementos. El metodoseria mucho masoptimo con “n” comparacionesmenos (n = total de elementos).
Actividad • ¿Cuálesserían los cambios a efectuarsobre el algoritmo anterior, paralograrunaBurbujamejorada?. • Se pide, escribir el algoritmoyejecutar
BurbujaOptimizada • Si al cambio anterior (el de la burbujamejorada) le sumamosotrocambio, el hechoque los elementosqueestandetrás del que se estacomparando, yaestanordenados, lascomparacionesserianaunmenosy el métodoseriaaunmasefectivo. • Si tenemosunalista de 10 elementosyestamosanalizando el quintoelemento, quesentidotieneque el quinto se compare con el primero, el segundoo el tercero, sisupuestamente, yaestanordenados? Entoncesoptimizamosmasaun el algoritmo, quedandonuestra version final del algoritmooptimizado de la siguientemanera:
BurbujaOptimizada • Bubblesort(int vector[]) { int aux; inti,j; for(i = 0; i <vector.length; i++) { for(j = 0; j < i; j++) { if(vector[i] <vector [j]) { aux =vector [j]; vector[j] =vector [i]; vector[i] = aux; } } } }
MétodoporSelección • La ordenaciónporselecciónfuncionaseleccionando el menorelemento del arregloyllevándolo al principio. A continuación, selecciona el siguientemenory lo pone en la segundaposición del arregloyasísucesivamente.
MétodoporSelección La ordenaciónporselecciónfuncionaseleccionando el menorelemento del arregloyllevándolo al principio. A continuación, selecciona el siguientemenory lo pone en la segundaposición del arregloyasísucesivamente Seleccion(int[] vector) { inti, j, k, p, aux, limit = vector.length-1; for(k = 0; k < limit; k++) { p = k; for(i = k+1;i<= limit; i++) if(vector[i] <vector [p]) p= i; if(p != k) { aux= vector[p]; vector[p] =vector [k]; vector[k] = aux; } } }
MétodoporInserción El ciclo principal de la ordenaciónporinserciónvaexaminandosucesivamentetodos los elementos del arreglodesdeel segundohasta el n-ésimo, einsertacadauno en el lugaradecuado entre susprecedesoresdentro del arreglo. Insercion(int vector[]) { inti, temp, j; for (i = 1; i <vector.length; i++) { temp =vector[i]; j= i - 1; while ( (vector[j] > temp) && (j >= 0) ) {vector[j + 1] =vector [j]; j--; } vector[j + 1] = temp; } }
Ordenamientopormezcla • Este algoritmoconsistebasicamente en dividir en partesiguales la lista de numerosyluegomezclarloscomparándolos, dejándolosordenados. • Si se piensa en estealgoritmorecursivamente, podemosimaginarquedividirá la listahastatener un elemento en cadalista, luego lo compara con el queestá a suladoysegúncorresponda, lo situadondecorresponde.
Ordenamientopormezcla • En la siguientefigurapodemosvercomofunciona:
Ordenamientopormezcla • El algoritmo de ordenamientopormezcla (Mergesort) se divide en dos procesos, • a) se divide en partesiguales la lista: • public static void mergesort(int[ ] vector, int init, intn) • { int n1; • int n2; • if (n > 1) • { n1 = n / 2; • n2 = n - n1; • mergesort(vector, init, n1); • mergesort(vector, init + n1, n2); • merge(vector, init, n1, n2); • } • }
Ordenamientopormezcla • private static void merge(int[ ] matrix, int init, int n1, int n2) • { int[ ] buffer = new int[n1+n2]; • inttemp = 0; • int temp1 = 0; • inttemp2 = 0; • inti; • while ((temp1 < n1) && (temp2 < n2)) • { if (matrix[init + temp1] < matrix[init + n1 + temp2])buffer[temp++] = matrix[init + (temp1++)]; • else • buffer[temp++] = matrix[init + n1 + (temp2++)]; • } • while (temp1 < n1) • buffer[temp++] = matrix[init + (temp1++)]; • while (temp2 < n2) • buffer[temp++] = matrix[init + n1 + (temp2++)]; • for (i = 0; i < n1+n2; i++) • matrix[init + i] = buffer[i]; • } • b) mezclar los elementossegúncorresponda:
MétodoShellSort • Este métodoesunamejora del algoritmo de ordenamientoporInserción(Insertsort). • Si tenemos en cuentaque el ordenamientoporinserciónes mucho maseficientesinuestralista de numerosesta semi-ordenadayquedesplaza un valor unaunicaposicióna la vez. • Durante la ejecuciónde estealgoritmo, los númerosde la lista se van casi-ordenandoyfinalmente, el ultimo pasoofunciónde estealgoritmoes un simple métodoporinserciónque, al estarcasi-ordenados los números, esmáseficiente.
MétodoShellSort public void shellSort(int[] matrix) { for ( intinc = matrix.length / 2;inc > 0;inc = (inc == 2 ? 1 : (int) Math.round(inc/ 2.2))) { for (inti =inc ; i < matrix.length; i++) { for (intj = i; j >=inc && matrix[j -inc ] > matrix[j]; j -=inc ) { int temp = matrix[j]; matrix[j] = matrix[j - inc]; matrix[j - inc] = temp; } } } }
MétodoRápido (quickSort) • Sin duda, estealgoritmoesuno de los maseficientes. Este metodoes el masrápidogracias a susllamadasrecursivas, basandose en la teoria de divide yvencerás. • Lo quehaceestealgoritmoesdividirrecurvisamente elarreglos en partesiguales, indicando un elemento de inicio, fin y un pivote (ocomodin) quenospermitirasegmentarnuestralista. Unavezdividida, lo quehace, esdejartodos los mayoresque el pivote a suderechaytodos los menores a suizq. Al finalizar el algoritmo, nuestroselementosestanordenados.
MétodoRápido (quickSort) • Porejemplo, sitenemos 3 5 4 8 basicamente lo quehace el algoritmoesdividir la lista de 4 elementos en partesiguales, por un lado 3, porotrolado 4 8 ycomocomodinopivote el 5. • Luegopregunta, 3 es mayor omenorque el comodin? Es menor, entonces lo deja al ladoizq. Y como se acabaron los elementos de eselado, vamos al otrolado. • 4 Es mayor omenorque el pivote?. Menor, entonces lo tira a suizq. Luegopreguntapor el 8, al ser mayor lo dejadondeesta, quedandoalgoasi: 3 4 5 8
MétodoRápido (quickSort) • En estafigura se ilustra de mejormanera un vector con maselementos, usandocomopivote el primer elemento:
MétodoRápido (quickSort) public void _Quicksort(int matrix[], int a, intb) { this.matrix = new int[matrix.length]; intbuf; intfrom = a; intto = b; intpivot = matrix[(from+to)/2]; do { while(matrix[from] < pivot) { from++; } while(matrix[to] > pivot) { to--; } … Continua
MétodoRápido (quickSort) if(from <= to) { buf= matrix[from]; matrix[from] = matrix[to]; matrix[to] = buf; from++; to--; } } while(from <= to); if(a < to) { _Quicksort(matrix, a, to); } if(from < b) { _Quicksort(matrix, from, b); } this.matrix = matrix; }
Complejidad • Cadaalgoritmo de ordenamientopordefiniciontieneoperacionesycalculosminimosymaximosquerealiza (complejidad), a continuacionunatablaqueindica la cantidad de calculosquecorresponden a cadametodo de ordenamiento: