PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 3 – Ordenación(Clasificación) y Búsqueda 3.1.1 – Método de Intercambio o burbuja Los computadores emplean gran parte de su tiempo en operaciones de búsqueda y ordenamiento. Existen 2 métodos de ordenación: ordenación interna (de arrays) y ordenación externa (archivos). Los arrays se almacenan en la memoria interna o central, de acceso aleatorio y directo, y por ello su gestión es rápida. Los archivos se sitúan adecuadamente en dispositivos de almacemaniento externo, que son más lentos y basados en dispositivos mecánicos: cintas y discos magnéticos. Escuela de Ingeniería Informática ICI 241 – Estructura de Datos PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 64 72 50 50 50 50 50 50 50 50 64 23 23 23 23 23 23 23 50 50 72 23 23 23 23 23 23 23 23 64 64 64 64 64 64 64 23 23 23 72 72 72 72 72 72 72 72 72 72 18 18 18 18 18 Desarrollado por Ricardo Soto De Giorgis 84 84 84 84 84 18 18 18 18 18 18 18 18 72 37 37 37 37 18 18 18 18 18 84 37 37 37 37 37 37 37 37 72 72 72 72 37 37 37 37 37 37 84 84 84 84 84 84 84 84 84 84 45 45 99 45 99 45 99 45 99 45 99 45 99 45 99 45 99 45 45 99 45 8 45 8 45 8 45 8 45 8 45 8 45 8 84 8 8 84 Consiste en insertar un elemento en el vector en una parte ya ordenada de este vector y comenzar de nuevo con los elementos restantes. Esta inserción se realiza más fácilmente con una bandera (sw) Desarrollado por Ricardo Soto De Giorgis 5 14 24 39 43 Escuela de Ingeniería Informática Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 3.1.2 – Ordenación por inserción directa (método de la baraja) 65 Escuela de Ingeniería Informática void burbuja2(int n,float a[max]) { int i,j; float aux; for (i=0;i<=n-1;i++) for (j=0;j<=n-1-i;j++) if(a[j]>a[j+1]){ aux=a[j]; a[j]=a[j+1]; a[j+1]=aux; } } Capítulo 3 – Ordenamiento y Búsqueda 43 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Esto se refleja decrementando en 1 el límite superior del segundo bucle for después de cada paso. Escuela de Ingeniería Informática 39 Escuela de Ingeniería Informática En el primer recorrido del vector (cuando I=1) el valor mayor del vector se mueve al último elemento a[n]. Por lo tanto, en el siguiente paso no es necesario comparar a[n-1] y a[n]. PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO 24 Desarrollado por Ricardo Soto De Giorgis Se puede realizar una mejora en la velocidad de ejecución del algoritmo. 8 8 8 8 8 8 8 8 8 99 99 99 99 99 99 99 99 99 ICI 241 – Estructura de Datos 14 void burbuja1(int n,float a[max]) { int i,j; float aux; for (i=0;i<=n-1;i++) for (j=0;j<=n-1;j++) if(a[j]>a[j+1]){ aux=a[j]; a[j]=a[j+1]; a[j+1]=aux; } } 3.1.1 – Método de Intercambio o burbuja (mejorado) Escuela de Ingeniería Informática 5 Se basa en el principio de comparar pares de elementos adyacentes e intercambiarlos entre si hasta que estén todos ordenados. Capítulo 3 – Ordenamiento y Búsqueda 3.1.1 – Ejercicio - Método de Intercambio o burbuja 72 64 64 64 64 64 64 64 64 64 50 50 50 50 50 50 50 50 Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 3.1 – Ordenamiento Interno Desarrollado por Ricardo Soto De Giorgis PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO 84 45 65 84 45 ICI 241 – Estructura de Datos 3.1.2 – Ordenación por inserción directa (método de la baraja) void insercion_directa(int n,float a[max]) { int i,j,sw; float aux; for (i=1;i<=n-1;i++){ aux=a[i]; j=i-1; sw=0; while((j>=0) && (sw==0)) if (a[j]>aux){ a[j+1]=a[j]; j--; }else sw=1; a[j+1]=aux; } } Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática ICI 241 – Estructura de Datos 1 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 64 72 64 50 50 23 23 23 23 18 50 50 72 64 64 50 37 37 37 23 Desarrollado por Ricardo Soto De Giorgis 23 23 23 72 72 64 50 50 45 37 84 84 84 84 84 72 64 64 50 45 18 18 18 18 18 84 72 72 64 50 37 37 37 37 37 37 84 84 72 64 99 99 99 99 99 99 99 99 84 72 45 45 45 45 45 45 45 45 99 84 8 8 8 8 8 8 8 8 8 99 Escuela de Ingeniería Informática void insercion_binaria(int n,float a[max]){ int i,j,p,u,c; float aux; for (i=1;i<n;i++){ aux=a[i]; p=0; u=i-1; while(p<=u){ c=(p+u)/2; if (a[c]>aux) u=c-1; else p=c+1; } for(j=i-1;j>=p,j--) a[j+1]=a[j]; a[p]=aux; } } Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 72 64 50 23 84 18 37 99 45 8 64 72 50 23 84 18 37 99 45 8 50 64 72 23 84 18 37 99 45 8 23 50 64 72 84 18 37 99 45 8 23 50 64 72 84 18 37 99 45 8 18 23 50 64 72 84 37 99 45 8 18 23 37 50 64 72 84 99 45 8 18 23 37 50 64 72 84 99 45 8 18 23 37 45 50 64 72 84 99 8 8 37 45 50 64 72 84 99 Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática 37 99 45 23 84 18 37 99 45 72 8 18 50 23 84 64 37 99 45 72 8 18 23 50 84 64 37 99 45 72 8 18 23 37 84 64 50 99 45 72 8 18 23 37 45 64 50 99 84 72 8 18 23 37 45 50 64 99 84 72 8 18 23 37 45 50 64 99 84 72 8 18 23 37 45 50 64 72 84 99 8 18 23 37 45 50 64 72 84 99 Escuela de Ingeniería Informática Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Escuela de Ingeniería Informática 3.1.5 – Ordenación por inserción con incrementos decrecientes (Método Shell). 8 8 64 50 Desarrollado por Ricardo Soto De Giorgis Desarrollado por Ricardo Soto De Giorgis Capítulo 3 – Ordenamiento y Búsqueda 3.1.4 – Ejercicio - Ordenación por selección 18 Escuela de Ingeniería Informática void seleccion(int n,float a[max]){ int i,j,k; float aux; for (i=0;i<n-1;i++){ k=i; for(j=i+1;j<n;j++) if (a[j]<a[k]) k=j; aux=a[k]; a[k]=a[i]; a[i]=aux; } } Escuela de Ingeniería Informática 84 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Este método se basa en buscar el elemento menor del vector y ubicarlo en primera posición. Luego se busca el segundo elemento más pequeño y se ubica en la segunda posición, y así sucesivamente. Capítulo 3 – Ordenamiento y Búsqueda 23 Escuela de Ingeniería Informática 3.1.4 – Ordenación por selección ICI 241 – Estructura de Datos PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO 72 64 50 Desarrollado por Ricardo Soto De Giorgis Capítulo 3 – Ordenamiento y Búsqueda 3.1.3 – Ejercicio - Ordenación por inserción binaria 23 3.1.3 – Ordenación por inserción binaria El método de inserción directa se puede mejorar fácilmente realizando, para ubicar el lugar de inserción, una búsqueda binaria en vez de una búsqueda secuencial. ICI 241 – Estructura de Datos PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO 18 Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 3.1.2 – Ejercicio - Ordenación por inserción directa (método de la baraja) 72 64 50 23 23 18 18 18 18 8 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Es una mejora del método de inserción directa que se utiliza cuando el número de elementos a ordenar es grande. En el método de ordenación por inserción, cada elemento se compara con los elementos contiguos de su izquierda, uno tras otro. Si el elemento a insertar es uno de los más pequeños, hay que ejecutar muchas comparaciones antes de ubicarlo en su lugar correcto Shell modificó los saltos contiguos resultantes de las comparaciones por saltos de mayor tamaño y con eso se consigue una ordenación más rápida ICI 241 – Estructura de Datos Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática ICI 241 – Estructura de Datos 2 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda void partir(int v[20],int p, int u){ int aux; i=p,j=u; x = v[(p+u)/2]; while (i<=j){ while (v[i]<x) i++; while (v[j]>x)j--; if (i<=j){ aux=v[i]; v[i]=v[j]; v[j]=aux; i++; j--; } } if(p<j) partir(v,p,j); if(i<u) partir(v,i,u); } PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO 2 6 6 6 0 2 2 2 4 4 3 3 3 Desarrollado por Ricardo Soto De Giorgis 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 0 0 0 0 6 6 6 6 6 6 6 6 6 i=3 i=4 i=5 i=6 i=6 i=1 i=2 i=3 i=3 i=4 i=4 i=5 i=6 salto=3 salto=1 Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Escuela de Ingeniería Informática 18 11 27 4 11 27 4 11 9 [13] 9 4 16 [13] 9 18 16 [13] 27 18 16 4 [11] 9 4 [11] 9 4 9 11 ICI 241 – Estructura de Datos Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO ICI 241 – Estructura de Datos Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 3.2 – Búsqueda 3.2.1 – Búsqueda secuencial o lineal Los computadores emplean gran parte de su tiempo en operaciones de búsqueda y ordenamiento. De igual forma que en el “Ordenamiento” existen 2 casos típicos de búsqueda: búsqueda interna (de arrays) y búsqueda externa (archivos). Los arrays se almacenan en la memoria interna o central, de acceso aleatorio y directo, y por ello su gestión es rápida. Los archivos se sitúan adecuadamente en dispositivos de almacemaniento externo, que son más lentos y basados en dispositivos mecánicos: cintas y discos magnéticos. Desarrollado por Ricardo Soto De Giorgis 5 5 5 4 4 4 4 4 2 2 2 2 2 3.1.6 – Ejercicio - Método de ordenación rápida (Quicksort). Se basa en el hecho de que es más rápido y fácil ordenar dos listas pequeñas que una lista grande. Escuela de Ingeniería Informática 1 1 1 1 1 1 1 1 1 1 1 1 1 Capítulo 3 – Ordenamiento y Búsqueda 3.1.6 – Método de ordenación rápida (Quicksort). Desarrollado por Ricardo Soto De Giorgis 3.1.5 – Ejercicio - Método Shell. 6 2 2 2 2 0 0 0 0 0 0 0 0 void shell(int n,float a[max]){ int i,j,k,salto; float aux; salto = n/2; while (salto>0){ for (i=salto;i<n;i++){ j=i-salto; while (j>=0){ k=j+salto; if (a[j]<=a[k]) j=-1; else{ aux=a[j]; a[j]=a[k]; a[k]=aux; j=j-salto; } } } salto=salto/2; } } Escuela de Ingeniería Informática Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 3.1.5 – Ordenación por inserción con incrementos decrecientes (Método Shell). Desarrollado por Ricardo Soto De Giorgis PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática ICI 241 – Estructura de Datos Se explora el vector en forma secuencial, es decir, se recorre el vector desde el primer elemento al último. Se compara cada elemento del vector con el valor deseado Esta comparación se detiene cuando el elemento es encontrado o se recorrió todo el vector. No requiere vector ordenado void secuencial(int v[20],int valor){ int i,enc=0; while ((!enc)&&(i<20)){ if(v[i]==valor) enc=1; else i++; } if(enc) printf(“valor %d encontrado en posición %d“,valor,i); else printf(“valor no encontrado“); } Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática ICI 241 – Estructura de Datos 3 PONTIFICIA UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniería Informática Capítulo 3 – Ordenamiento y Búsqueda 3.2.2 – Búsqueda binaria Suponga que desea buscar el nombre de una persona en una guía telefónica, normalmente no se buscaría en forma secuencial. Sino que se buscaría en la primera o segunda mitad de la guía, una vez en esa mitad, se volvería a tantear en una de sus dos submitades, y así sucesivamente se repitiría el proceso. Requiere vector ordenado void binaria(int v[20],int valor){ int i,enc=0; i=0;p=19; while((p<=u)&&(!enc)){ c=(p+u)/2; if(v[c]==valor) enc=1; else{ if (v[c]>valor) u=c-1; else p=c+1; } } if(enc) printf(“valor %d encontrado en posición %d“,valor,i); else printf(“valor no encontrado“); } Desarrollado por Ricardo Soto De Giorgis Escuela de Ingeniería Informática ICI 241 – Estructura de Datos 4