Professional Documents
Culture Documents
Pgina 1
SESIN 12:
II TEMAS A TRATAR
Mtodo de ordenacin por Intercambio. Mtodo de ordenacin por Insercin. Mtodo de ordenacin Burbuja. Mtodo de ordenacin por seleccin.
Sesin 12
Pgina 2
Este Orden puede ser: Ascendente: (i<j) entonces (k[i]<=k[j]) {nuestros ej} Descendente: (i>j) entonces (k[i]>=k[j]) Hay Numerosos Mtodos de Ordenamiento que difieren en eficiencia. Anlisis de algoritmo orientado a las comparaciones realizadas por cada uno. Las comparaciones sern funcin de n. Siendo n el tamao del vector a Ordenar. CLASIFICACIN DE MTODOS DE ORDENACIN Todos los mtodos se vern con Orden Ascendente. Analizaremos los siguientes mtodos: Bsicos: Son eficaces en Listas pequeas - Burbuja e Intercambio: simple pero Ineficiente. - Insercin: Recomendado. Avanzados: Son eficaces en Listas grandes. - Shell: muy extendido. ORDENACIN POR INTERCAMBIO El ms sencillo de todos. Se basa en: la lectura sucesiva de la lista a ordenar, comparando el elemento inferior de la lista con todos los restantes. Efectuando el Intercambio de posiciones cuando el orden resultante no sea correcto. Siendo n la cantidad de elementos, Realizar al menos n1 pasadas. ORDENACIN POR INTERCAMBIO: EJEMPLO Ordenar la siguiente secuencia de nmeros: 8, 4, 6, 2 SOLUCIN Pasada 0: Se compara a[0] con todos, as primero se cambia a[0] con a[1] pues a[0] > a[1] y debe ser Ascendente, es decir a[0]<a[1] y por ultimo a[0] con a[3]
Sesin 12
Pgina 3
Pasada 1: El elemento mas pequeo esta en a[0] y se analiza la sublista restante. Al cabo de la pasada, el segundo mas chico esta en a[1].
Pasada 2:
{ int i, j, aux; /* se realizan n-1 pasadas, a[o] ... a[n-2] */ for (i = 0 ; i <= n-2 ; i++)/* coloca mnimo de a[i+1]...a[n-1] en a[i] */ for (j = i+1 ; j <= n-1 ; j++) if (a[i] > a[j]) { aux = a[i]; a[i] = a[j]; a[j]= aux ; } }
Sesin 12
Pgina 4
void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={8, 4, 6, 2}; ordIntercambio(v,N); mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; } Presione F5
o haga clic en
10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4
Sesin 12
Pgina 5
SOLUCIN
Sesin 12
Pgina 6
Sesin 12
Pgina 7
10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4
Sesin 12
Pgina 8
SOLUCIN Pasada 0:
Sesin 12
Pgina 9
ORDENACIN POR BURBUJA: CODIFICACIN EN C/C++ void ordBurbuja (int a[], int n) { int interruptor = 1; int pasada, j; for (pasada=0;pasada<n-1 && interruptor;pasada++) { long aux;/* bucle externo controla la cantidad de pasadas */ interruptor = 0; for (j = 0; j < n-pasada-1; j++) if (a[j] > a[j+1]) /* elementos desordenados, es necesario intercambio */ { interruptor = 1; aux = a[j]; a[j] = a[j+1]; a[j+1] = aux; } } }
Mejor Caso: en una lista ordenada, har una sola pasada: F(n)=n Peor Caso: F(n)=n2
Burbuja.cpp
#include<iostream.h> #include<stdlib.h> #define N 5 void ordBurbuja (int a[], int n) { int interruptor = 1; int pasada, j; for (pasada=0;pasada<n-1 && interruptor;pasada++) { long aux;/* bucle externo controla la cantidad de pasadas */ interruptor = 0; for (j = 0; j < n-pasada-1; j++) if (a[j] > a[j+1]) /* elementos desordenados, es necesario intercambio */ { interruptor = 1; aux = a[j]; a[j] = a[j+1]; a[j+1] = aux; } } } void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={50, 20, 40, 80, 30}; ordBurbuja(v,N) ; mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; } Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C. Sesin 12
Pgina 10
Presione F5
o haga clic en
10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4
Sesin 12
Pgina 11
Para i=1 hasta n-1 hacer Asignar a k el menor valor de v[i..n] Intercambiar v[i] con v[k] Fpara
void ordSeleccion (int A[], int n) { int minimo=0, temp=0; for(int i=0 ; i<n-1 ; i++) { minimo=i; for(int j=i+1 ; j<n ; j++) { if (A[minimo] > A[j]) minimo=j; } temp=A[minimo]; A[minimo]=A[i]; A[i]=temp; } }
Seleccion.cpp
#include<iostream> #include<stdlib.h> #define N 5 using namespace std; void ordSeleccion (int A[], int n) { int minimo=0, temp=0; for(int i=0 ; i<n-1 ; i++) { minimo=i; for(int j=i+1 ; j<n ; j++) { if (A[minimo] > A[j]) minimo=j; } temp=A[minimo]; A[minimo]=A[i]; A[i]=temp; } } Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C. Sesin 12
Laboratorio de Algoritmia y Estructura de Datos I void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={50, 20, 40, 80, 30}; ordSeleccion(v,N) ; mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; } PROPUESTOS Ordenar manualmente usando el mtodo de Seleccin la siguiente secuencia.
Pgina 12
10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4
Sesin 12
Pgina 13
IV
(La prctica tiene una duracin de 4 horas)
ACTIVIDADES
1. Analizar el procedimiento de ordenacin de cada uno de los mtodos a travs de la siguiente aplicacin Java http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html
Sesin 12
Pgina 14
Sesin 12
Pgina 15
3. Verificar la cantidad de comparaciones que efectua los diferentes mtodos de ordenamiento http://maven.smith.edu/~thiebaut/java/sort/
Sesin 12
Pgina 16
Sesin 12
Pgina 17
Sesin 12
Pgina 18
Sesin 12
Pgina 19
V EJERCICIOS
1. Desarrolle un programa el lenguaje ANSI C que dados dos arreglos A y B cada uno con 10 elementos: Llene los arreglos A y B. Ordene ascendentemente A y B por los mtodos de intercambio, insercin, burbuja y seleccin. Mezcle ordenadamente los elementos de A y B en un arreglo C el cual no debe contener elementos repetidos. 2. Dado un arreglo de tamao 30 que almacena nmeros reales, desarrolle un programa el lenguaje ANSI C que llene el arreglo. Adems, debe permitir ordenar los elementos que estn en las posiciones pares en forma ascendente y los elementos que estn en las posiciones impares en forma descendente utilizando el algoritmo de seleccin. Observaciones: No utilice otro arreglo para dejar ordenado los elementos. No ordene los valores al momento de ingresarlos. 3. En los algoritmos Burbuja o Seleccin, el elemento ms pequeo de a[i..n] es colocado en la posicin i mediante intercambios, para valores sucesivos de i. Otra posibilidad es colocar el elemento mximo de a[1..j] en la posicin j, para valores de j entre n y 1. A este algoritmo se le denomina ordenacin por Ladrillos (Bricksort). Implementar dicho algoritmo y estudiar su complejidad. 4. Una variante curiosa de los algoritmos anteriores resulta al combinar los mtodos de la Burbuja y de los Ladrillos. La idea es ir colocando alternativamente el mayor valor de a[1..j] en a[j], y el menor valor de a[i..n] en a[i]. Implementar dicho algoritmo, conocido como Sacudidas (Shakersort), y estudiar su complejidad. 5. Modificar el algoritmo de ordenacin por Seleccin de forma que se intercambien los elementos nicamente si son distintos. Qu impacto tiene esta modificacin sobre la complejidad del algoritmo? 6. Se da un arreglo que contiene N nmeros. Se desea determinar si hay 2 nmeros dentro del arreglo cuya suma sea igual a un nmero dado K. Por ejemplo, si la entrada es 8, 4, 1, 6, y K es 10, entonces la respuesta es s (4 y 6). Un nmero puede ser utilizado dos veces. De un algoritmo de tiempo O(NlogN) para resolver este problema (Pista: ordene los elementos primero. Despus de hacer esto, se podr resolver este problema en tiempo lineal). 7. El problema del k-simo elemento: Dado un vector de enteros, queremos encontrar el elemento que ocupara la posicin k si el vector estuviera ordenado en orden creciente (esto es, el k-simo menor elemento). Una primera idea para resolver este problema consiste en ordenar primero el
Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C. Sesin 12
Pgina 20
vector y despus escoger el elemento en la posicin k, pero la complejidad de este algoritmo es O(nlogn). Puede hacerse de alguna forma ms eficiente? Considerar la siguiente idea: Ordenar el vector slo hasta la posicin k, utilizando un mtodo incremental como el de Seleccin. 8. Modificar el algoritmo bubble-sort, de tal manera que d el comportamiento requerido en las siguientes grficas. Verificar experimentalmente que la modificacin disminuye el tiempo de ordenamiento. Original Modificado: es ms rpido. Original Modificado: es ms rpido
VI CUESTIONARIO
1. Cuales son los mtodos de bsqueda que conoces? Cul es el mejor? 2. Cules son los rdenes de las complejidades de cada uno de los mtodos de ordenacin y bsqueda vistos en esta prctica? Cul es el menos complejo?
Sesin 12
Pgina 21
Sesin 12