Upload
brunilda-hilario
View
223
Download
0
Embed Size (px)
Citation preview
Tema 8b
Búsqueda y ordenación en arreglos
Ordenación
• Es un proceso que altera el orden de los elementos de un conjunto.
• Tiene asociada una relación de orden– Números: valor– Letras: alfabeto– Auto: ¿Velocidad? ¿Tamaño? ¿Autonomía?– Amigos: ¿…..?
• La ordenación puede ser ascendente o descendente.
Ordenación
• Métodos– Burbuja (Bubble sort)– Selección– Inserción– Burbuja bidireccional– Rápido (Quicksort)
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.
Bubble sort
r
a
c
f
b
e
i
a
1-Como r es más “pesada” que a,r “baja” y a “sube”
a
r
c
f
b
e
i
a
a
c
r
f
b
e
i
a
2-Como r es más “pesada” que c,r “baja” y c “sube”
a
c
f
b
e
i
a
r
…
Bubble sort
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;
}}
Selecció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.
Selecciónvoid 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;
}}
}
Inserció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.
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;
}}
Quicksort
• 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
Nº de elementos
Tie
mpo
de
ejec
ució
n
N2
Quicksort
• 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
Nº de elementos
Tie
mpo
de
ejec
ució
n
Nlog(N)
Búsqueda
• Consiste en buscar un elemento dentro de un conjunto
• Requiere de una relación de igualdad– 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
• Métodos– Secuencial– Binaria
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;
}
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