Ordenación • Es un proceso que altera el orden de los elementos de un conjunto. • Tiene asociada una relación de orden Tema 8b – – – – Búsqueda y ordenación en arreglos Números: valor Letras: alfabeto Auto: ¿Velocidad? ¿Tamaño? ¿Autonomía? Amigos: ¿…..? • La ordenación puede ser ascendente o descendente. Ordenación Bubble sort • Los elementos más “pesados” “bajan” • Los elementos más “livianos” “suben” • Cuando ya no puede bajar más se sigue con el resto. • Métodos – – – – – Burbuja (Bubble sort) Selección Inserción Burbuja bidireccional Rápido (Quicksort) Bubble sort 1-Como r es más “pesada” que a, r “baja” y a “sube” Bubble sort 2-Como r es más “pesada” que c, r “baja” y c “sube” r a a a a r c c c c r f f f f b b b b e e e i i i i a a a a r … e void bubblesort(int numeros[]){ int i,j; for(i=1;i<N;i++) for(j=0;j<(N-i);j++) if(numeros[j]>numeros[j+1]){ int aux = numeros[j+1]; numeros[j+1] = numeros[j]; numeros[j] = aux; } } 1 Selección Selección void selectionsort_up(int numeros[]){ int i,j,k,r; int n; int inter; for(i=0;i<N-1;i++){ inter=0; k=i; n=numeros[i]; for(j=i+1;j<N;j++) if(numeros[j]<n){ r=j; n=numeros[j]; inter=1; } if(inter){ numeros[r] = numeros[i]; numeros[i] = n; } } } • Se selecciona el minimo valor entre los N elementos y se intercambia con el primero. • Se repite la operación con los N-1 elementos restantes. Inserción Inserción void insertionsort_up(int numeros[]){ int i,j; int n; for(i=1;i<N;i++){ n=numeros[i]; for(j=i-1; (j>=0)&&(n<numeros[j]) ;j--) numeros[j+1] = numeros[j]; numeros[j+1] = n; } } • Ordena el subarreglos de manera creciente • Ordena los primeros dos elementos • Luego va insertando los siguientes en su posición ordenada en el subarreglo. • Los algoritmos anteriores ejecutan un numero de instrucción del orden de N2 – Ordenar 10 elementos ejecuta α100 instrucciones. – Ordenar 100 elementos ejecuta α10000 instrucciones. – Ordenar 1000 elementos ejecuta α1000000 instrucciones. Quicksort Tiempo de ejecución Quicksort αN2 Nº de elementos 2 • Quicksort es un algoritmo de proposito general. • Es en la mayoria de los casos el más eficiente. • Tiene un orden α N log(N) • Tiene una estructura recursiva. Quicksort Tiempo de ejecución Quicksort αNlog(N) Nº de elementos Búsqueda • Consiste en buscar un elemento dentro de un conjunto • Requiere de una relación de igualdad Búsqueda • Métodos – Secuencial – Binaria – Números: Igual valor • ¿Cuántos decimales considerar? – Letras: mismo símbolo • ¿Mayusculas y minúsculas? – Autos • • • • Modelo y año Placa patente Codigo chasis Etc… Búsqueda secuencial • Recorrer uno por uno los elementos. • Comparar según sea el criterio. • Se puede querer recuperar el valor o ela posición. • Tiene un orden αN Búsqueda secuencial int secuencial_search(int numeros[], int valor){ int i=0; for(i=0;i<N;i++) if(numeros[i]==valor) return i; return -1; } 3 Búsqueda secuencial • En arreglos bidimensionales el algortimo es similar. • Se puede hacer por filas o por columas. • Esta decision puede afectar el rendimiento – Por lo general, preferir por filas. Búsqueda secuencial int bisecuencial_search(int numeros[][N], int valor){ int i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) if(numeros[i][j]==valor) return i*N+j; return -1; } … pos = bisecuencial_search(binumeros, 11); if(pos>=0) printf("bisec) numeros[%d][%d] = %d\n", pos/N,pos%N, binumeros[pos/N][pos%N]); Búsqueda binaria • • • • Muy rápida Requiere datos ordenados No sirve para recuperar la posición original. “Encierra” el numero búscado “achicando” a la mitad el intervalo que parece contenerlo. • Tiene un orden αlog2N Búsqueda binaria int binary_search(int numeros[], int valor){ int i,j,m; insertionsort_up(numeros); i=0; j=N-1; while(i<=j){ m=(i+j)/2; if(valor<numeros[m]) j=m-1; else if(valor>numeros[m]) i=m+1; else return m; } return -1; } Fin Tema 8b Búsqueda y ordenación en arreglos 4