Tema 8b Ordenación Ordenación Bubble sort Bubble sort Bubble sort

Anuncio
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
Descargar