7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.

Slides:



Advertisements
Presentaciones similares
Introducción a C++ Sistemas Operativos
Advertisements

Método de ordenación por inserción
Ordenamiento de Arreglos
Searching data in Arrays COMP 242. Linear Search Algoritmo: Comenzando con el primer elemento, se compara cada uno con el valor a buscar y se detiene.
Arithmetic Operators & Operators Precedence
Ejemplo de un programa en C++ donde se manipulan archivos de datos
Abstracción de Datos Arrays.
8 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
6 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
Ejemplo de Programa C++
Computadoras y programación
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Listas enlazadas c++ Prof. Franklin Cedeño.
7A7A7A7A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.
Paricial IV Ing. Esmeralda Elizabeth Rodríguez Rodríguez
ORDENACION POR EL METODO DE LA SACUDIDA (SHAKER SORT)
Curso de Programación 1 Plan 97
6 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez / Pablo Moreno Ger Facultad.
9A9A9A9A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.
8A8A8A8A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.

INFORMATICA I Funciones CLASE 13.
CS1101X Programming Methodology
PROGRAMACION DE ESTRUCTURAS DE DATOS
Algoritmos de Búsqueda
3 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
8 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Introducción a la Computación
SOBRECARGA DE FUNCIONES
5A5A5A5A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez/Pablo Moreno Ger Facultad.
4A4A4A4A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.
Estructuras de repetición
Diseño de algoritmos “Estructuras”
Estructuras dinámicas de datos, TAD Lista, parte 2
Ordenación, Clasificación
Grado en Ingeniería electrónica y comunicaciones Facultad de Físicas Universidad Complutense P1 Fundamentos de Programación.
Estructuras de Control de Repetición
Introducción a la Computación
Sección 5-2 Estructuras de Control de Decisión Expresiones Lógicas.
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
4 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Raquel Hervás Ballesteros Facultad.
4 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
Cátedra de COMPUTACIÓN FACULTAD DE INGENIERÍA - UNA La mejor manera de aprender Programación es PROGRAMANDO !!!!!! CLASE Nro. 1.
Universidad Domingo Savio Facultad de Ciencias y Tecnología de la Información Carrera Ingeniería en Redes y Telecomunicaciones Materia : Programación I.
Preparado por: Nelliud D. Torres Enero/2003 Versión 1.0
Búsqueda. Búsqueda Secuencial Es el método de búsqueda más sencillo En un arreglo o lista ligada consiste en ir visitando cada uno de sus elementos y.
COMPUTACION 2009 Clase 6 Clase 7.
Algoritmos de búsqueda
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Slide 2- 1.
Ordenación y Búsqueda.
Laboratorio Análisis y Diseño de Algoritmos 2 Biblioteca estándar de templates de C++ Standard Template Library (STL)‏ Motivación Ejemplo: Lista + Iterador.
Diseño de Algoritmos. Curso J.L. Leiva O. TEMA3TEMA3 TEMA3TEMA3 Estructuras Dinámicas Contenido del Tema Profesor: José Luis Leiva Olivencia. Despacho:
Estructuras de Repetición (Hacer-Mientras)
Tema ‧ Comando - while Repeticiones. Comando while ‧ Un ciclo es cualquier construcción de programa que repite una sentencia ó secuencia de sentencias.
Estructuras de Repetición (Hacer-Mientras)
Sesión 2. Este algoritmo ordena un arreglo de forma ascendente o descendente comparando la casilla de arriba con la casilla consecutiva de abajo, utiliza.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
INTRODUCCIÓN AL LENGUAJE C++. Instrucciones Temas.
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings
3A3A3A3A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática.
5 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad.
Algoritmo.
ORDENAMIENTO DE DATOS Jorge Méndez Sánchez Eliúh Cuecuecha Hernández
ARREGLOS O ARRAYS.
ESTRUCTURAS DE DATOS “Conceptualización de estructuras de datos” Por: Eduardo Robayo.
PROF. RAFAEL MONTENEGRO B. UNELLEZ-APURE Introducci Ó n a los Arreglos (“arrays”) en C++
UNIVERSIDAD DIEGO PORTALES Facultad de Ingeniería Programación Avanzada TIPOS ABSTRACTOS DE DATOS TAD Tema: TIPOS ABSTRACTOS DE DATOS TAD Subtema: LISTAS.
Searching data in Arrays
Transcripción de la presentación:

7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Fundamentos de la programación

Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Algoritmos de ordenación651 Algoritmo de ordenación por inserción654 Ordenación de arrays por inserción665 Algoritmo de ordenación por inserción con intercambios672 Claves de ordenación680 Estabilidad de la ordenación688 Complejidad y eficiencia692 Ordenaciones naturales694 Ordenación por selección directa701 Método de la burbuja716 Listas ordenadas722 Búsquedas en listas ordenadas729 Búsqueda binaria731

Luis Hernández Yáñez Página 651 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Ordenación de listas Mostrar los datos en orden, facilitar las búsquedas,... Variadas formas de hacerlo (algoritmos) Página 652 Fundamentos de la programación: Algoritmos de ordenación Algoritmo de ordenación (de menor a mayor) array[i] <= array[i + 1]

Luis Hernández Yáñez Ordenación de listas Los datos de la lista deben poderse comparar entre sí Sentido de la ordenación: Ascendente (de menor a mayor) Ascendente (de menor a mayor) Descendente (de mayor a menor) Descendente (de mayor a menor) Algoritmos de ordenación básicos: Ordenación por inserción Ordenación por inserción Ordenación por selección directa Ordenación por selección directa Ordenación por el método de la burbuja Ordenación por el método de la burbuja Los algoritmos se basan en comparaciones e intercambios Hay otros algoritmos de ordenación mejores Página 653 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Página 654 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Algoritmo de ordenación por inserción Partimos de una lista vacía Vamos insertando cada elemento en el lugar que le corresponda Baraja de nueve cartas numeradas del 1 al 9 Las cartas están desordenadas Ordenaremos de menor a mayor (ascendente) Página 655 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 656 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: 55 Colocamos el primer elemento en la lista vacía

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 657 Fundamentos de la programación: Algoritmos de ordenación El 7 es mayor que todos los elementos de la lista Lo insertamos al final Lista ordenada:

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 658 Fundamentos de la programación: Algoritmos de ordenación Primer elemento (5) mayor que el nuevo (4): Desplazamos todos una posición a la derecha Insertamos el nuevo en la primera posición Hemos insertado el elemento en su lugar Lista ordenada:

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 659 Fundamentos de la programación: Algoritmos de ordenación es mayor que todos los elementos de la lista Lo insertamos al final Lista ordenada:

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 660 Fundamentos de la programación: Algoritmos de ordenación Primer elemento (4) mayor que el nuevo (2): Desplazamos todos una posición a la derecha Insertamos el nuevo en la primera posición Lista ordenada:

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 661 Fundamentos de la programación: Algoritmos de ordenación El 9 es el primer elemento mayor que el nuevo (8): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 9 Lista ordenada:

Luis Hernández Yáñez 88 Algoritmo de ordenación por inserción Página 662 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Segundo elemento (4) mayor que el nuevo (3): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 4

Luis Hernández Yáñez 2233 Algoritmo de ordenación por inserción Página 663 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Primer elemento (2) mayor que el nuevo (1): Desplazamos todos una posición a la derecha Insertamos el nuevo en la primera posición

Luis Hernández Yáñez Algoritmo de ordenación por inserción Página 664 Fundamentos de la programación: Algoritmos de ordenación ¡¡¡ LISTA ORDENADA !!! Lista ordenada: El 7 es el primer elemento mayor que el nuevo (6): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 7

Luis Hernández Yáñez Ordenación de arrays por inserción El array contiene inicialmente la lista desordenada: A medida que insertamos: dos zonas en el array Parte ya ordenada y elementos por procesar Página 665 Fundamentos de la programación: Algoritmos de ordenación Parte ya ordenada Elementos por insertar Siguiente elemento a insertar en la parte ya ordenada

Luis Hernández Yáñez Ordenación de arrays por inserción Situación inicial: Lista ordenada con un solo elemento (primero) Desde el segundo elemento del array hasta el último: Localizar el primer elemento mayor en lo ya ordenado Página 666 Fundamentos de la programación: Algoritmos de ordenación Primer elemento mayor o igual: índice 0 77nuevonuevo

Luis Hernández Yáñez Ordenación de arrays por inserción... Desplazar a la derecha los ordenados desde ese lugar Insertar el nuevo en la posición que queda libre Página 667 Fundamentos de la programación: Algoritmos de ordenación 77nuevonuevo 77nuevonuevo

Luis Hernández Yáñez Implementación... int nuevo, pos; // Desde el segundo elemento hasta el último... for (int i = 1; i < N; i++) { nuevo = lista[i]; nuevo = lista[i]; pos = 0; pos = 0; while ((pos nuevo)) { while ((pos nuevo)) { pos++; pos++; } // pos: índice del primer mayor; i si no lo hay // pos: índice del primer mayor; i si no lo hay for (int j = i; j > pos; j--) { for (int j = i; j > pos; j--) { lista[j] = lista[j - 1]; lista[j] = lista[j - 1]; } lista[pos] = nuevo; lista[pos] = nuevo;} Página 668 Fundamentos de la programación: Algoritmos de ordenación const int N = 15; typedef int tLista[N]; tLista lista;

Luis Hernández Yáñez Página 669 Fundamentos de la programación: Algoritmos de ordenación 77nuevonuevo00pospos11ii

Luis Hernández Yáñez Página 670 Fundamentos de la programación: Algoritmos de ordenación 55nuevonuevo00pospos44ii

Luis Hernández Yáñez Página 671 Fundamentos de la programación: Algoritmos de ordenación 1414nuevonuevo33pospos55ii

Luis Hernández Yáñez Página 672 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez La inserción de cada elemento se puede realizar con comparaciones e intercambios Desde el segundo elemento hasta el último: Desde la posición del nuevo elemento a insertar: Mientras el anterior sea mayor, intercambiar Página 673 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Página 674 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez... int tmp, pos; // Desde el segundo elemento hasta el último... for (int i = 1; i < N; i++) { pos = i; pos = i; // Mientras no al principio y anterior mayor... // Mientras no al principio y anterior mayor... while ((pos > 0) && (lista[pos - 1] > lista[pos])) { while ((pos > 0) && (lista[pos - 1] > lista[pos])) { // Intercambiar... // Intercambiar... tmp = lista[pos]; tmp = lista[pos]; lista[pos] = lista[pos - 1]; lista[pos] = lista[pos - 1]; lista[pos - 1] = tmp; lista[pos - 1] = tmp; pos--; // Posición anterior pos--; // Posición anterior }} Página 675 Fundamentos de la programación: Algoritmos de ordenación const int N = 15; typedef int tLista[N]; tLista lista;

Luis Hernández Yáñez #include #include using namespace std; #include #include const int N = 100; typedef int tArray[N]; typedef struct { // Lista de longitud variable tArray elementos; tArray elementos; int contador; int contador; } tLista; int main() { tLista lista; tLista lista; ifstream archivo; ifstream archivo; int dato, pos, tmp; int dato, pos, tmp; lista.contador = 0; lista.contador = 0; Página 676 Fundamentos de la programación: Algoritmos de ordenación insercion.cppinsercion.cpp

Luis Hernández Yáñez archivo.open("insercion.txt"); archivo.open("insercion.txt"); if (!archivo.is_open()) { if (!archivo.is_open()) { cout << "Error de apertura de archivo!" << endl; cout << "Error de apertura de archivo!" << endl; } else { else { archivo >> dato; archivo >> dato; while ((lista.contador < N) && (dato != -1)) { while ((lista.contador < N) && (dato != -1)) { // Centinela -1 al final // Centinela -1 al final lista.elementos[lista.contador] = dato; lista.elementos[lista.contador] = dato; lista.contador++; lista.contador++; archivo >> dato; archivo >> dato; } archivo.close(); archivo.close(); // Si hay más de N ignoramos el resto // Si hay más de N ignoramos el resto cout << "Antes de ordenar:" << endl; cout << "Antes de ordenar:" << endl; for (int i = 0; i < lista.contador; i++) { for (int i = 0; i < lista.contador; i++) { cout << lista.elementos[i] << " "; cout << lista.elementos[i] << " "; } cout << endl;... cout << endl;... Página 677 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez for (int i = 1; i < lista.contador; i++) { for (int i = 1; i < lista.contador; i++) { pos = i; pos = i; while ((pos > 0) while ((pos > 0) && (lista.elementos[pos-1] > lista.elementos[pos])) && (lista.elementos[pos-1] > lista.elementos[pos])) { tmp = lista.elementos[pos]; tmp = lista.elementos[pos]; lista.elementos[pos] = lista.elementos[pos - 1]; lista.elementos[pos] = lista.elementos[pos - 1]; lista.elementos[pos - 1] = tmp; lista.elementos[pos - 1] = tmp; pos--; pos--; } } cout << "Después de ordenar:" << endl; cout << "Después de ordenar:" << endl; for (int i = 0; i < lista.contador; i++) { for (int i = 0; i < lista.contador; i++) { cout << lista.elementos[i] << " "; cout << lista.elementos[i] << " "; } cout << endl; cout << endl; } return 0; return 0;} Página 678 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Consideración de implementación ¿Operador relacional adecuado? lista[pos - 1] ¿ > o >= ? lista[pos] Con >= se realizan intercambios inútiles: Página 679 Fundamentos de la programación: Algoritmos de ordenación ¡Intercambio inútil!

Luis Hernández Yáñez Página 680 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Claves de ordenación Elementos que son estructuras con varios campos: const int N = 15; typedef struct { int codigo; int codigo; string nombre; string nombre; double sueldo; double sueldo; } tDato; typedef tDato tLista[N]; tLista lista; Clave de ordenación: Campo en el que se basan las comparaciones Página 681 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Claves de ordenación tDato tmp; while ((pos > 0) && (lista[pos - 1].nombre > lista[pos].nombre)) { && (lista[pos - 1].nombre > lista[pos].nombre)) { tmp = lista[pos]; tmp = lista[pos]; lista[pos] = lista[pos - 1]; lista[pos] = lista[pos - 1]; lista[pos - 1] = tmp; lista[pos - 1] = tmp; pos--; pos--;} Comparación: campo concreto Intercambio: elementos completos Página 682 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Claves de ordenación Función para la comparación: bool operator>(tDato opIzq, tDato opDer) { return (opIzq.nombre > opDer.nombre); return (opIzq.nombre > opDer.nombre);} tDato tmp; while ((pos > 0) && (lista[pos - 1] > lista[pos])) { tmp = lista[pos]; tmp = lista[pos]; lista[pos] = lista[pos - 1]; lista[pos] = lista[pos - 1]; lista[pos - 1] = tmp; lista[pos - 1] = tmp; pos--; pos--;} Página 683 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Claves de ordenación #include #include using namespace std; #include #include const int N = 15; typedef struct { int codigo; int codigo; string nombre; string nombre; double sueldo; double sueldo; } tDato; typedef tDato tArray[N]; typedef struct { tArray datos; tArray datos; int cont; int cont; } tLista;... Página 684 Fundamentos de la programación: Algoritmos de ordenación claves.cppclaves.cpp

Luis Hernández Yáñez void mostrar(tLista lista); bool operator>(tDato opIzq, tDato opDer); int main() { tLista lista; tLista lista; ifstream archivo; ifstream archivo; lista.cont = 0; lista.cont = 0; archivo.open("datos.txt"); archivo.open("datos.txt"); if (!archivo.is_open()) { if (!archivo.is_open()) { cout << "Error de apertura del archivo!" << endl; cout << "Error de apertura del archivo!" << endl; } else { else { tDato dato; tDato dato; archivo >> dato.codigo; archivo >> dato.codigo; while ((lista.cont < N) && (dato.codigo != -1)) { while ((lista.cont < N) && (dato.codigo != -1)) { archivo >> dato.nombre >> dato.sueldo; archivo >> dato.nombre >> dato.sueldo; lista.datos[lista.cont] = dato; lista.datos[lista.cont] = dato; lista.cont++; lista.cont++; archivo >> dato.codigo; archivo >> dato.codigo; } archivo.close();... archivo.close();... Página 685 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez cout << "Antes de ordenar:" << endl; cout << "Antes de ordenar:" << endl; mostrar(lista); mostrar(lista); for (int i = 1; i < lista.cont; i++) { for (int i = 1; i < lista.cont; i++) { // Desde el segundo elemento hasta el último // Desde el segundo elemento hasta el último int pos = i; int pos = i; while ((pos > 0) while ((pos > 0) && (lista.datos[pos-1] > lista.datos[pos])) { && (lista.datos[pos-1] > lista.datos[pos])) { tDato tmp; tDato tmp; tmp = lista.datos[pos]; tmp = lista.datos[pos]; lista.datos[pos] = lista.datos[pos - 1]; lista.datos[pos] = lista.datos[pos - 1]; lista.datos[pos - 1] = tmp; lista.datos[pos - 1] = tmp; pos--; pos--; } } cout << "Después de ordenar:" << endl; cout << "Después de ordenar:" << endl; mostrar(lista); mostrar(lista); } return 0; return 0; }... Página 686 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez void mostrar(tLista lista) { for (int i = 0; i < lista.cont; i++) { for (int i = 0; i < lista.cont; i++) { cout << setw(10) cout << setw(10) << lista.datos[i].codigo << lista.datos[i].codigo << setw(20) << setw(20) << lista.datos[i].nombre << lista.datos[i].nombre << setw(12) << setw(12) << fixed << fixed << setprecision(2) << setprecision(2) << lista.datos[i].sueldo << lista.datos[i].sueldo << endl; << endl; }} bool operator>(tDato opIzq, tDato opDer) { return (opIzq.nombre > opDer.nombre); return (opIzq.nombre > opDer.nombre);} Página 687 Fundamentos de la programación: Algoritmos de ordenación Cambia a codigo o sueldo para ordenar por otros campos

Luis Hernández Yáñez Página 688 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Algoritmos de ordenación estables Al ordenar por otra clave una lista ya ordenada, la segunda ordenación preserva el orden de la primera tDato : tres posibles claves de ordenación (campos) CodigoNombreSueldo Lista ordenada por Nombre Lista ordenada por Nombre Página 689 Fundamentos de la programación: Algoritmos de ordenación Álvarez Benítez Domínguez Durán Fernández Gómez Hernández Jiménez Pérez Sánchez Sergei Tarazona Turégano Urpiano Álvarez Benítez Domínguez Durán Fernández Gómez Hernández Jiménez Pérez Sánchez Sergei Tarazona Turégano Urpiano 90000

Luis Hernández Yáñez Ordenamos ahora por el campo Codigo : Página 690 Fundamentos de la programación: Algoritmos de ordenación Sergei Hernández Urpiano Benítez Pérez Durán Sánchez Álvarez Turégano Gómez Domínguez Jiménez Fernández Tarazona Sergei Hernández Urpiano Benítez Pérez Durán Sánchez Álvarez Turégano Gómez Domínguez Jiménez Fernández Tarazona Hernández Sergei Benítez Durán Pérez Urpiano Álvarez Gómez Sánchez Turégano Domínguez Jiménez Fernández Tarazona Hernández Sergei Benítez Durán Pérez Urpiano Álvarez Gómez Sánchez Turégano Domínguez Jiménez Fernández Tarazona No estable: Los nombres no mantienen sus posiciones relativas Estable: Los nombres mantienen sus posiciones relativas

Luis Hernández Yáñez Ordenación por inserción Estable siempre que utilicemos Con = no es estable Ordenamos por sueldo: A igual sueldo, ordenado por códigos y a igual código, por nombres Página 691 Fundamentos de la programación: Algoritmos de ordenación Hernández Sergei Benítez Durán Pérez Urpiano Álvarez Gómez Sánchez Turégano Domínguez Jiménez Fernández Tarazona Hernández Sergei Benítez Durán Pérez Urpiano Álvarez Gómez Sánchez Turégano Domínguez Jiménez Fernández Tarazona Pérez Urpiano Sánchez Domínguez Sergei Benítez Gómez Turégano Jiménez Durán Álvarez Fernández Tarazona Hernández Pérez Urpiano Sánchez Domínguez Sergei Benítez Gómez Turégano Jiménez Durán Álvarez Fernández Tarazona Hernández

Luis Hernández Yáñez Página 692 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Casos de estudio para los algoritmos de ordenación Lista inicialmente ordenada Lista inicialmente ordenada Lista inicialmente ordenada al revés Lista inicialmente ordenada al revés Lista con disposición inicial aleatoria Lista con disposición inicial aleatoria ¿Trabaja menos, más o igual la ordenación en cada caso? Página 693 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Ordenaciones naturales Si el algoritmo trabaja menos cuanto más ordenada está inicialmente la lista, se dice que la ordenación es natural Ordenación por inserción con la lista inicialmente ordenada: Versión que busca el lugar primero y luego desplaza: No hay desplazamientos; mismo número de comparaciones Comportamiento no natural Versión que busca el lugar primero y luego desplaza: No hay desplazamientos; mismo número de comparaciones Comportamiento no natural Versión con intercambios: Trabaja mucho menos; basta una comparación cada vez Comportamiento natural Versión con intercambios: Trabaja mucho menos; basta una comparación cada vez Comportamiento natural Página 694 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Elección de un algoritmo de ordenación ¿Cómo de bueno es cada algoritmo? ¿Cuánto tarda en comparación con otros algoritmos? Algoritmos más eficientes: los de menor complejidad Tardan menos en realizar la misma tarea Comparamos en orden de complejidad: O() En función de la dimensión de la lista a ordenar: N O() = f (N) Operaciones que realiza el algoritmo de ordenación: Comparaciones Comparaciones Intercambios Intercambios Asumimos que tardan un tiempo similar Página 695 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Cálculo de la complejidad Ordenación por inserción (con intercambios):... for (int i = 1; i < N; i++) { int pos = i; int pos = i; while ((pos > 0) && (lista[pos - 1] > lista[pos])) { while ((pos > 0) && (lista[pos - 1] > lista[pos])) { int tmp; int tmp; tmp = lista[pos]; tmp = lista[pos]; lista[pos] = lista[pos - 1]; lista[pos] = lista[pos - 1]; lista[pos - 1] = tmp; lista[pos - 1] = tmp; pos--; pos--; }} Intercambios y comparaciones: Tantos como ciclos realicen los correspondientes bucles Página 696 Fundamentos de la programación: Algoritmos de ordenación ComparaciónComparación IntercambioIntercambio

Luis Hernández Yáñez Cálculo de la complejidad... for (int i = 1; i < N; i++) { int pos = i; int pos = i; while ((pos > 0) && (lista[pos - 1] > lista[pos])) { while ((pos > 0) && (lista[pos - 1] > lista[pos])) { int tmp; int tmp; tmp = lista[pos]; tmp = lista[pos]; lista[pos] = lista[pos - 1]; lista[pos] = lista[pos - 1]; lista[pos - 1] = tmp; lista[pos - 1] = tmp; pos--; pos--; }} Caso en el que el while se ejecuta más: caso peor Caso en el que se ejecuta menos: caso mejor Página 697 Fundamentos de la programación: Algoritmos de ordenación N - 1 ciclos Nº variable de ciclos

Luis Hernández Yáñez Cálculo de la complejidad Caso mejor: lista inicialmente ordenada La primera comparación falla: ningún intercambio (N - 1) * (1 comparación + 0 intercambios) = N - 1 O(N) Caso mejor: lista inicialmente ordenada La primera comparación falla: ningún intercambio (N - 1) * (1 comparación + 0 intercambios) = N - 1 O(N) Caso peor: lista inicialmente ordenada al revés Para cada pos, entre i y 1: 1 comparación y 1 intercambio (N - 1) ((N - 1) + 1) x (N - 1) / 2 N * (N - 1) / 2 (N 2 - N) / 2 O(N 2 ) Caso peor: lista inicialmente ordenada al revés Para cada pos, entre i y 1: 1 comparación y 1 intercambio (N - 1) ((N - 1) + 1) x (N - 1) / 2 N * (N - 1) / 2 (N 2 - N) / 2 O(N 2 ) Notación O grande: orden de complejidad en base a N El término en N que más rápidamente crece al crecer N En el caso peor, N 2 crece más rápido que N O(N 2 ) (Ignoramos las constantes, como 2) Página 698 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Ordenación por inserción (con intercambios) Caso mejor: O(N) Caso mejor: O(N) Caso peor: O(N 2 ) Caso peor: O(N 2 ) Caso medio (distribución aleatoria de los elementos): O(N 2 ) Hay algoritmos de ordenación mejores Página 699 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Órdenes de complejidad O(log N) < O(N) < O(N log N) < O(N 2 ) < O(N 3 )... N log 2 N N 2 N log 2 N N Página 700 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Página 701 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 702 Fundamentos de la programación: Algoritmos de ordenación Seleccionar el siguiente elemento menor de los que queden Lista ordenada: Lista desordenada:

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 703 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Página 704 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden Algoritmo de ordenación por selección directa

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 705 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 706 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 707 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 708 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 709 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 710 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Algoritmo de ordenación por selección directa Página 711 Fundamentos de la programación: Algoritmos de ordenación Lista ordenada: Lista desordenada: ¡¡¡ LISTA ORDENADA !!! Seleccionar el siguiente elemento menor de los que queden

Luis Hernández Yáñez Ordenación de un array por selección directa Desde el primer elemento ( i = 0) hasta el penúltimo (N-2): Menor elemento (en m ) entre i + 1 y el último (N-1) Intercambiar los elementos en i y m si no son el mismo Página 712 Fundamentos de la programación: Algoritmos de ordenación mmii mmii Sólo intercambiamos si no es la misma posición

Luis Hernández Yáñez Ordenación de un array por selección directa Página 713 Fundamentos de la programación: Algoritmos de ordenación mmii mmii mmii

Luis Hernández Yáñez Implementación // Desde el primer elemento hasta el penúltimo... for (int i = 0; i < N - 1; i++) { int menor = i; int menor = i; // Desde i + 1 hasta el final... // Desde i + 1 hasta el final... for (int j = i + 1; j < N; j++) { for (int j = i + 1; j < N; j++) { if (lista[j] < lista[menor]) { if (lista[j] < lista[menor]) { menor = j; menor = j; } } if (menor > i) { if (menor > i) { int tmp; int tmp; tmp = lista[i]; tmp = lista[i]; lista[i] = lista[menor]; lista[i] = lista[menor]; lista[menor] = tmp; lista[menor] = tmp; }} Página 714 Fundamentos de la programación: Algoritmos de ordenación seleccion.cppseleccion.cpp const int N = 15; typedef int tLista[N]; tLista lista;

Luis Hernández Yáñez Complejidad de la ordenación por selección directa ¿Cuántas comparaciones se realizan? Bucle externo: N - 1 ciclos Tantas comparaciones como elementos queden en la lista: (N - 1) + (N - 2) + (N - 3) = N x (N - 1) / 2 = (N 2 - N) / 2 O(N 2 ) Mismo número de comparaciones en todos los casos Complejidad: O(N 2 )Igual que el método de inserción Algo mejor (menos intercambios; uno en cada paso) No es estable: intercambios a larga distancia No se garantiza que se mantenga el mismo orden relativo original Comportamiento no natural (trabaja siempre lo mismo) Página 715 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Página 716 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Algoritmo de ordenación por el método de la burbuja Variación del método de selección directa El elemento menor va ascendiendo hasta alcanzar su posición Página 717 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Página 718 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Ordenación de un array por el método de la burbuja Desde el primero ( i = 0), hasta el penúltimo (N - 2): Desde el último ( j = N – 1), hasta i + 1: Si elemento en j < elemento en j - 1, intercambiarlos... int tmp; // Del primero al penúltimo... for (int i = 0; i < N - 1; i++) { // Desde el último hasta el siguiente a i... // Desde el último hasta el siguiente a i... for (int j = N - 1; j > i; j--) { for (int j = N - 1; j > i; j--) { if (lista[j] < lista[j - 1]) { if (lista[j] < lista[j - 1]) { tmp = lista[j]; tmp = lista[j]; lista[j] = lista[j - 1]; lista[j] = lista[j - 1]; lista[j - 1] = tmp; lista[j - 1] = tmp; } }} Página 719 Fundamentos de la programación: Algoritmos de ordenación burbuja.cppburbuja.cpp const int N = 10; typedef int tLista[N]; tLista lista;

Luis Hernández Yáñez Algoritmo de ordenación por el método de la burbuja Complejidad: O(N 2 ) Comportamiento no natural Estable (mantiene el orden relativo) Mejora: Si en un paso del bucle exterior no ha habido intercambios: La lista ya está ordenada (no es necesario seguir) Página 720 Fundamentos de la programación: Algoritmos de ordenación La lista ya está ordenada No hace falta seguir

Luis Hernández Yáñez bool inter = true; int i = 0; // Desde el 1º hasta el penúltimo si hay intercambios... while ((i < N - 1) && inter) { inter = false; inter = false; // Desde el último hasta el siguiente a i... // Desde el último hasta el siguiente a i... for (int j = N - 1; j > i; j--) { for (int j = N - 1; j > i; j--) { if (lista[j] < lista[j - 1]) { if (lista[j] < lista[j - 1]) { int tmp; int tmp; tmp = lista[j]; tmp = lista[j]; lista[j] = lista[j - 1]; lista[j] = lista[j - 1]; lista[j - 1] = tmp; lista[j - 1] = tmp; inter = true; inter = true; } } if (inter) { if (inter) { i++; i++; }} Página 721 Fundamentos de la programación: Algoritmos de ordenación burbuja2.cppburbuja2.cpp Esta variación sí tiene un comportamiento natural

Luis Hernández Yáñez Página 722 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Gestión de listas ordenadas Casi todas las tareas se realizan igual que en listas sin orden Operaciones que tengan en cuenta el orden: Inserción de un nuevo elemento: debe seguir en orden Inserción de un nuevo elemento: debe seguir en orden Búsquedas más eficientes Búsquedas más eficientes ¿Y la carga desde archivo? Si los elementos se guardaron en orden: se lee igual Si los elementos se guardaron en orden: se lee igual Si los elementos no están ordenados en el archivo: insertar Si los elementos no están ordenados en el archivo: insertar Página 723 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Declaraciones: Iguales que para listas sin orden const int N = 20; typedef struct { int codigo; int codigo; string nombre; string nombre; double sueldo; double sueldo; } tRegistro; typedef tRegistro tArray[N]; typedef struct { tArray registros; tArray registros; int cont; int cont; } tLista; Página 724 Fundamentos de la programación: Algoritmos de ordenación lista.cpplista.cpp

Luis Hernández Yáñez Subprogramas: Misma declaración que para listas sin orden void mostrarDato(int pos, tRegistro registro); void mostrar(tLista lista); bool operator>(tRegistro opIzq, tRegistro opDer); bool operator<(tRegistro opIzq, tRegistro opDer); tRegistro nuevo(); void insertar(tLista &lista, tRegistro registro, bool &ok); void eliminar(tLista &lista, int pos, bool &ok); // pos = 1..N int buscar(tLista lista, string nombre); void cargar(tLista &lista, bool &ok); void guardar(tLista lista); Página 725 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Nuevas implementaciones: Operadores relacionales Operadores relacionales Inserción (mantener el orden) Inserción (mantener el orden) Búsqueda (más eficiente) Búsqueda (más eficiente) Se guarda la lista en orden, por lo que cargar() no cambia bool operator>(tRegistro opIzq, tRegistro opDer) { return opIzq.nombre > opDer.nombre; return opIzq.nombre > opDer.nombre;} bool operator<(tRegistro opIzq, tRegistro opDer) { return opIzq.nombre < opDer.nombre; return opIzq.nombre < opDer.nombre;} Página 726 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez void insertar(tLista &lista, tRegistro registro, bool &ok) { ok = true; ok = true; if (lista.cont == N) { if (lista.cont == N) { ok = false; // lista llena ok = false; // lista llena } else { else { int i = 0; int i = 0; while ((i < lista.cont) && (lista.registros[i] < registro)) { while ((i < lista.cont) && (lista.registros[i] < registro)) { i++; i++; } // Insertamos en la posición i (primer mayor o igual) // Insertamos en la posición i (primer mayor o igual) for (int j = lista.cont; j > i; j--) { for (int j = lista.cont; j > i; j--) { // Desplazamos una posición a la derecha // Desplazamos una posición a la derecha lista.registros[j] = lista.registros[j - 1]; lista.registros[j] = lista.registros[j - 1]; } lista.registros[i] = registro; lista.registros[i] = registro; lista.cont++; lista.cont++; }} Página 727 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Página 728 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Búsqueda de un elemento en una secuencia No ordenada: recorremos hasta encontrarlo o al final Ordenada: recorremos hasta encontrarlo o mayor / al final Buscamos el 36: al llegar al final sabemos que no está Buscamos el 17: al llegar al 20 ya sabemos que no está Condiciones de terminación: Se llega al final Se llega al final Se encuentra el elemento buscado Se encuentra el elemento buscado Se encuentra uno mayor Se encuentra uno mayor Mientras no al final y el valor sea menor que el buscado Mientras no al final y el valor sea menor que el buscado Página 729 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez int buscado; cout << "Valor a buscar: "; cin >> buscado; int i = 0; while ((i < N) && (lista[i] < buscado)) { i++; i++;} // Ahora, o estamos al final o lista[i] >= buscado if (i == N) { // Al final: no se ha encontrado cout << "No encontrado!" << endl; cout << "No encontrado!" << endl;} else if (lista[i] == buscado) { // Encontrado! cout << "Encontrado en posición " << i + 1 << endl; cout << "Encontrado en posición " << i + 1 << endl;} else { // Hemos encontrado uno mayor cout << "No encontrado!" << endl; cout << "No encontrado!" << endl;} Página 730 Fundamentos de la programación: Algoritmos de ordenación Complejidad: O(N) const int N = 10; typedef int tLista[N]; tLista lista;

Luis Hernández Yáñez Página 731 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Búsqueda mucho más rápida que aprovecha la ordenación Comparar con el valor que esté en el medio de la lista: Si es el que se busca, terminar Si no, si es mayor, buscar en la primera mitad de la lista Si no, si es menor, buscar en la segunda mitad de la lista Repetir hasta encontrarlo o no quede sublista donde buscar Página 732 Fundamentos de la programación: Algoritmos de ordenación Buscamos el 12 Elemento mitad

Luis Hernández Yáñez Vamos buscando en sublistas cada vez más pequeñas (mitades) Delimitamos el segmento de la lista donde buscar Inicialmente tenemos toda la lista: Índice del elemento en la mitad: mitad = (ini + fin) / 2 Si no se encuentra, ¿dónde seguir buscando? Buscado < elemento en la mitad: fin = mitad - 1 Buscado > elemento en la mitad: ini = mitad + 1 Si ini > fin, no queda dónde buscar Página 733 Fundamentos de la programación: Algoritmos de ordenación iniinifinfinmitadmitad

Luis Hernández Yáñez 12 < lista[mitad] fin = mitad – 1 12 > lista[mitad] ini = mitad + 1 Página 734 Fundamentos de la programación: Algoritmos de ordenación iniinifinfinmitadmitad Buscamos el 12iniinifinfinmitadmitad iniinifinfin mitadmitad ¡Encontrado!

Luis Hernández Yáñez Si el elemento no está, nos quedamos sin sublista: ini > fin 13 > lista[mitad] ini = mitad < lista[mitad] fin = mitad – 1 2 ¡¡¡ ini > fin !!! No hay dónde seguir buscando No está Página 735 Fundamentos de la programación: Algoritmos de ordenación mitadmitadiniini finfin iniini finfinmitadmitad Para el 13:

Luis Hernández Yáñez Implementación int buscado; cout << "Valor a buscar: "; cin >> buscado; int ini = 0, fin = N – 1, mitad; bool encontrado = false; while ((ini <= fin) && !encontrado) { mitad = (ini + fin) / 2; // División entera mitad = (ini + fin) / 2; // División entera if (buscado == lista[mitad]) { if (buscado == lista[mitad]) { encontrado = true; encontrado = true; } else if (buscado < lista[mitad]) { else if (buscado < lista[mitad]) { fin = mitad - 1; fin = mitad - 1; } else { else { ini = mitad + 1; ini = mitad + 1; } } // Si se ha encontrado, está en [mitad] Página 736 Fundamentos de la programación: Algoritmos de ordenación const int N = 10; typedef int tLista[N]; tLista lista;

Luis Hernández Yáñez #include #include using namespace std; #include #include const int N = 100; typedef int tArray[N]; typedef struct { tArray elementos; tArray elementos; int cont; int cont; } tLista; int buscar(tLista lista, int buscado); int main() { tLista lista; tLista lista; ifstream archivo; ifstream archivo; int dato; int dato; lista.cont = 0; lista.cont = 0; archivo.open("ordenados.txt"); // Existe y es correcto archivo.open("ordenados.txt"); // Existe y es correcto archivo >> dato; archivo >> dato; Página 737 Fundamentos de la programación: Algoritmos de ordenación binaria.cppbinaria.cpp

Luis Hernández Yáñez while ((lista.cont < N) && (dato != -1)) { while ((lista.cont < N) && (dato != -1)) { lista.elementos[lista.cont] = dato; lista.elementos[lista.cont] = dato; lista.cont++; lista.cont++; archivo >> dato; archivo >> dato; } archivo.close(); archivo.close(); for (int i = 0; i < lista.cont; i++) { for (int i = 0; i < lista.cont; i++) { cout << lista.elementos[i] << " "; cout << lista.elementos[i] << " "; } cout << endl; cout << endl; int buscado, pos; int buscado, pos; cout << "Valor a buscar: "; cout << "Valor a buscar: "; cin >> buscado; cin >> buscado; pos = buscar(lista, buscado); pos = buscar(lista, buscado); if (pos != -1) { if (pos != -1) { cout << "Encontrado en la posición " << pos + 1 << endl; cout << "Encontrado en la posición " << pos + 1 << endl; } else { else { cout << "No encontrado!" << endl; cout << "No encontrado!" << endl; } return 0; return 0; }... Página 738 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez int buscar(tLista lista, int buscado) { int pos = -1, ini = 0, fin = lista.cont - 1, mitad; int pos = -1, ini = 0, fin = lista.cont - 1, mitad; bool encontrado = false; bool encontrado = false; while ((ini <= fin) && !encontrado) { while ((ini <= fin) && !encontrado) { mitad = (ini + fin) / 2; // División entera mitad = (ini + fin) / 2; // División entera if (buscado == lista.elementos[mitad]) { if (buscado == lista.elementos[mitad]) { encontrado = true; encontrado = true; } else if (buscado < lista.elementos[mitad]) { else if (buscado < lista.elementos[mitad]) { fin = mitad - 1; fin = mitad - 1; } else { else { ini = mitad + 1; ini = mitad + 1; } } if (encontrado) { if (encontrado) { pos = mitad; pos = mitad; } return pos; return pos;} Página 739 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Complejidad ¿Qué orden de complejidad tiene la búsqueda binaria? Caso peor: No está o se encuentra en una sublista de 1 elemento Nº de comparaciones = Nº de mitades que podemos hacer N / 2, N / 4, N / 8, N / 16,..., 8, 4, 2, 1 1, 2, 4, 8,..., N / 16, N / 8, N / 4, N / 2 1, 2, 4, 8,..., N / 16, N / 8, N / 4, N / 2 Si hacemos que N sea igual a 2 k : 2 0, 2 1, 2 2, 2 3,..., 2 k-4, 2 k-3, 2 k-2, 2 k-1 Nº de elementos de esa serie: k Nº de comparaciones = kN = 2 k k = log 2 N Complejidad: O(log 2 N)Mucho más rápida que O(N) Página 740 Fundamentos de la programación: Algoritmos de ordenación

Luis Hernández Yáñez Licencia CC (Creative Commons) Creative CommonsCreative Commons Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Este documento tiene establecidas las siguientes: Pulsa en la imagen de arriba a la derecha para saber más. Fundamentos de la programación: Algoritmos de ordenación Página 741 Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas.