Algoritmos de Ordenación

Documentos relacionados
Universidad de Cantabria

Este método se basa en buscar el elemento menor el vector y colocarlo en la primera

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Curso de Programación 1

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Tema: Métodos de Ordenamiento. Parte 1.

<tipo> Tipo de dato de los elementos del vector

Solución - práctico 10

Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot

ORDENAMIENTO Y BÚSQUEDA EN ARREGLOS

7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.

CAPITULO II ORDENAMIENTO Y BUSQUEDA. Ivan Medrano Valencia

Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos

Algoritmos de Ordenamiento

Tiempo de Ejecución. Midiendo el Tiempo de Ejecución

Capítulo. Algoritmos de ordenación y búsqueda. Contenido. Introducción

Métodos de Ordenamiento. Unidad VI: Estructura de datos

Complejidad de los Algoritmos

Tema 3. Análisis de costes

Algorítmica y Complejidad. Tema 3 Ordenación.

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

PROGRAMACIÓN ESTRUCTURADA

Algoritmos de Ordenamiento

TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN

Algoritmos: Análisis de Algoritmos

Notación Asintótica 2

Ordenamiento Avanzado: Shellshort y Quicksort

Complejidad de Algoritmos

Programación de Sistemas

La eficiencia de los programas

Algorítmica y Lenguajes de Programación. Ordenación (ii) En la lección anterior se vieron dos métodos de ordenación:

Tema 5- Diseño Recursivo y. Ordenación Vectorial: Inserción Directa (II) Ordenación Vectorial: Inserción Directa. Tema 5- Diseño Recursivo y Eficiente

Algoritmos de Búsqueda y Ordenación. Rosalía Laza Fidalgo. Departamento de Informática. Universidad de Vigo

DISEÑO DE UN ANIMADOR DE ALGORITMOS DE BÚSQUEDA Y ORDENACIÓN ( ID2012/055 )

ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA

INTRODUCCIÓN AL ESTUDIO DE ALGORITMOS Y SU COMPLEJIDAD

Fundamentos de la programación

Programación I (Plan 1999) Algoritmos y Estructuras de Datos II (Plan 2009) Mgter. Oscar Adolfo Vallejos FaCENA - UNNE

Mostrar Números Ascendentemente. Soluciones Ejercicios Tema 5. tostring Recursivo de LEG. Suma Recursiva de un Vector (1/3)

Análisis de Algoritmos

Complejidad computacional (Análisis de Algoritmos)

CAPÍTULO 10 ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA Búsqueda en listas Resumen Ejercicios Problemas

Diseño de algoritmos paralelos

NOTACIÓN O GRANDE. El análisis de algoritmos estima el consumo de recursos de un algoritmo.

Estructura de datos. Carrera: SCC Participantes

Analisis de algoritmos

Universidad Autónoma del Estado de Hidalgo Instituto de Ciencias Básicas e Ingeniería Área Académica de Computación y Electrónica

Algoritmos y Programación Clase 8

10. Algoritmos de ordenación

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO. Introducción FACULTAD DE INGENIERÍA. Ordenación

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Eligiendo algoritmos: El caso de ordenamiento

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Integrantes. Leonardo Herrera Cristian Fernandez Jorge A Mondragón. Análisis y Diseño de Algoritmos. Docente Diana Mabel Díaz Herrera.

Operadores y Expresiones

Sorting++ Herman Schinca. Clase de Junio de 2011

TEMA 2 FRACCIONES MATEMÁTICAS 2º ESO

Principios de Computadoras II

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Algoritmos de ordenamiento

CC3001 Algoritmos y Estructuras de Datos Tarea 1: Algoritmos simples de ordenación

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Algoritmos de Búsqueda y Ordenamiento

Java para programadores

Estudiemos el siguiente problema, propuesto por Wirth y desarrollado por Dijkstra: Una lista de las primeras secuencias que cumplen es:

Introducción a los Sistemas Operativos

Packages, Classpath y

4. Operadores Operador asignación

Lenguajes de Programación. Juan Zamora O. Semestre II Nombres, Ambitos y Ligados

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

Tema 8: Algoritmos de ordenación y búsqueda

APUNTES JAVA ARRAYS (ARREGLOS) Un arreglo es un grupo de posiciones de memoria contiguas. Todas las cuales tienen el mismo nombre y el mismo tipo.

COMPLEJIDAD Y EFICIENCIA DE ALGORITMOS

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

ÍNDICE INTRODUCCIÓN...13

Práctica1: Medición del Tiempo

COLEGIO AUGUSTO WALTE INFORMACIÓN DE ASIGNATURA I PERÍOD DESCRIPCIÓN DE CONTENIDOS

Proyecto 1: Algoritmos de Ordenación

Algoritmos de ordenación

Análisis y Diseño de Algoritmos

Vectores y matrices. Arrays Declaración Creación Acceso a los elementos de un array Manipulación de vectores y matrices

MATEMÁTICAS 6 GRADO. Código de Contenido El alumno empleará la lectura, escritura y comparación de diferentes cantidades de cifras numéricas.


Metodología y Tecnología de la Programación

Tema 2. El lenguaje JAVA

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Capítulo VI. Algoritmos: Ordenamiento

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Programación II. Mario Aldea Rivas Programación II 14/04/11 1

Planificaciones Algoritmos y Programación I. Docente responsable: AZCURRA DIEGO ANDRES. 1 de 5

INDICE Capitulo 1. introducción a las computadoras y a la programación Capitulo 2. El lenguaje de programación Java. aplicaciones y programas

UNIVERSIDAD DE LAS AMÉRICAS, A.C. Ciudad de México

Procesadores de lenguaje Tema 6 La tabla de símbolos

Algoritmos: Algoritmos sobre secuencias y conjuntos de datos

ÁREA: MATEMÁTICAS UNIDAD : 1 TEMPORALIZACIÓN: OCTUBRE 1ª QUINCENA OBJETIVOS CONTENIDOS CRITERIOS DE EVALUACIÓN

Metodología de la Programación II. Recursividad

UNIDAD DE APRENDIZAJE I

Transcripción:

Algoritmos de Ordenación Pedro Corcuera Dpto. Matemática Aplicada y Ciencias de la Computación Universidad de Cantabria corcuerp@unican.es

Algoritmos comunes - Ordenación Ordenación o clasificación es el proceso de reordenar un conjunto de objetos en un orden específico. El propósito de la ordenación es facilitar la búsqueda de elementos en el conjunto ordenado. Existen muchos algoritmos de ordenación, siendo la diferencia entre ellos la eficiencia en tiempo de ejecución. Los métodos de ordenación se pueden clasificar en dos categorías: ordenación de ficheros o externa y ordenación de arrays o interna. Java 2

Algoritmos comunes - Ordenación Formalmente el problema del ordenamiento se expresa como: Dados los elementos:,,, a 1 a 2 a n Ordenar consiste en permutar esos elementos en un orden: ak 1, ak 2,, ak n tal que dada una función de ordenamiento f: f( a ) f( a ) f( a ) k1 k2 k n Normalmente, la función de ordenamiento se guarda como un componente explícito (campo) de cada item (elemento). Ese campo se llama la llave del item. Un método de ordenamiento es estable si el orden relativo de elementos con igual llave permanece inalterado por el proceso de ordenamiento. Java 3

Algoritmos comunes - Ordenación Los métodos de ordenación buscan un uso eficiente de la memoria por lo que las permutaciones de elementos se hará in situ (uso del array original). Existen varios métodos de ordenación: burbuja, agitación, selección, inserción, quicksort, etc. Java 4

Análisis de Algoritmos: Complejidad Para comparar algoritmos se pueden estudiar desde dos puntos de vista: el tiempo que consume un algoritmo para resolver un problema (complejidad temporal) más interés la memoria que necesita el algoritmo (complejidad espacial). Para analizar la complejidad se cuentan los pasos del algoritmo en función del tamaño de los datos y se expresa en unidades de tiempo utilizando la notación asíntotica O- Grande (complejidad en el peor caso). Java 5

Análisis de Algoritmos: Complejidad Problema: Buscar el mayor valor en una lista de números desordenados (array) Algoritmo: (n = número de elementos) 1 max = s 1 2 i = 2 3 while i <= n 4 if s i > max then 5 max = s i 6 i = i + 1 7 endwhile Java 6

Análisis de Algoritmos: Complejidad Número de operaciones realizadas (unid): Línea Operaciones Tiempo 1 indexado y asignación 2 2 asignación 1 3 comparación 1 4,5,6 2 indexado, comparación, 6 2 asignación, suma Tiempo total: t(n) = 2 + 1 + (n 1) + 6 (n 1) = 3 + 7 (n 1) = 7n 4 Sean f(n) y g(n) funciones no negativas, f(n) es O(g(n)) si hay un valor c > 0 y n 0 1 tal que f(n) cg(n) para n n 0 Se dice que f(n) es de orden g(n) Ej: 7n 4 es O(n) si c=7 y n 0 = 1 Java 7

Método de Ordenación: burbuja Es un método caracterizado por la comparación e intercambio de pares de elementos hasta que todos los elementos estén ordenados. En cada iteración se coloca el elemento más pequeño (orden ascendente) en su lugar correcto, cambiándose además la posición de los demás elementos del array. La complejidad del algoritmo es O(n 2 ). Java 8

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 55 12 42 94 18 06 06 67 67 67 < 06 no hay intercambio Java 9

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 55 12 42 94 18 06 06 18 06 < 18 hay intercambio 67 67 Java 10

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 55 12 42 94 06 18 94 06 < 94 hay intercambio 06 18 67 67 Java 11

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 55 12 42 06 94 42 06 < 42 hay intercambio 18 94 06 18 67 67 Java 12

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 55 12 06 42 12 06 < 12 hay intercambio 94 42 18 94 06 18 67 67 Java 13

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 55 06 12 55 06 < 55 hay intercambio 42 12 94 42 18 94 06 18 67 67 Java 14

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 06 55 44 06 < 44 hay intercambio 12 55 42 12 94 42 18 94 06 18 67 67 Java 15

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 06 06 55 44 12 12 55 44 42 12 55 94 42 18 18 94 42 06 18 94 67 67 67 Java 16

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 06 06 06 55 44 12 12 12 55 44 18 42 12 55 44 94 42 18 55 18 94 42 42 06 18 94 67 67 67 67 94 Java 17

Método de Ordenación: burbuja Original 1ª iter 2ª iter 3ª iter 4ª iter 5ª iter 6ª iter 7ª iter 44 06 06 06 06 06 06 06 55 44 12 12 12 12 12 12 12 55 44 18 18 18 18 18 42 12 55 44 42 42 42 42 94 42 18 55 44 44 44 44 18 94 42 42 55 55 55 55 06 18 94 67 67 67 67 67 67 67 67 94 94 94 94 94 Java 18

Método de Ordenación: burbuja public class OrdBurbuja { public static void main(string args[]){ double data[]={321,123,213,234,1,4,5,6}; //Array a ordenar } } for(int i = 0; i < data.length; i++) for(int j = data.length-2; j >= i; j--) if (data[j] > data[j+1]) { /* orden ascendente */ double tmp = data[j]; data[j] = data[j+1]; data[j+1] = tmp; } Núcleo del algoritmo for (int i = 0; i < data.length; i++) { //Imprime array orden System.out.println(data[i]); } Java 19

Método de Ordenación: inserción Método usado para ordenar una mano de naipes. Los elementos están divididos conceptualmente en una secuencia destino y una secuencia fuente. En cada paso, comenzando con i=2 e incrementando i en uno, el elemento i-ésimo de la secuencia fuente se toma y se transfiere a la secuencia destino insertándolo en el lugar adecuado. Este algoritmo puede mejorarse fácilmente si vemos que la secuencia destino a 1, a 2,, a i 1 está ordenada, por lo que usamos una búsqueda binaria para determinar el punto de inserción. La complejidad del algoritmo es O(n 2 ). Es estable. Java 20

Método de Ordenación: inserción Or 44 55 12 42 94 18 06 67 1 44 55 12 42 94 18 06 67 2 3 4 5 6 7 Java 21

Método de Ordenación: inserción Or 44 55 12 42 94 18 06 67 1 44 55 12 42 94 18 06 67 2 12 44 55 42 94 18 06 67 3 4 5 6 7 Java 22

Método de Ordenación: inserción Or 44 55 12 42 94 18 06 67 1 44 55 12 42 94 18 06 67 2 12 44 55 42 94 18 06 67 3 12 42 44 55 94 18 06 67 4 5 6 7 Java 23

Método de Ordenación: inserción Or 44 55 12 42 94 18 06 67 1 44 55 12 42 94 18 06 67 2 12 44 55 42 94 18 06 67 3 12 42 44 55 94 18 06 67 4 12 42 44 55 94 18 06 67 5 12 18 42 44 55 94 06 67 6 06 12 18 42 44 55 94 67 7 06 12 18 42 44 55 67 94 Java 24

Método de Ordenación: inserción public class OrdInsercion { public static void main(string args[]) { double data[]={321,123,213,234,1,4,5,6}; //Array a ordenar } } for(int i = 1; i < data.length; i++) { int j = i-1; double tmp = data[i]; // Elemento a insertar while (j >= 0 && tmp < data[j]) { data[j+1] = data[j]; j = j-1; } data[j+1] = tmp; } for (int i = 0; i < data.length; i++) { //Imprime array orden System.out.println(data[i]); } Java 25

Método de Ordenación: selección En éste método, en el i-ésimo paso seleccionamos el elemento con la llave de menor valor, entre a[i],, a[n] y lo intercambiamos con a[i]. Como resultado, después de i pasadas, el i-ésimo elemento menor ocupará a[1],, a[i] en el lugar ordenado. La complejidad del algoritmo es O(n 2 ). Java 26

Método de Ordenación: selección Or 44 55 12 42 94 18 06 67 1 06 55 12 42 94 18 44 67 2 3 4 5 6 7 Java 27

Método de Ordenación: selección Or 44 55 12 42 94 18 06 67 1 06 55 12 42 94 18 44 67 2 06 12 55 42 94 18 44 67 3 4 5 6 7 Java 28

Método de Ordenación: selección Or 44 55 12 42 94 18 06 67 1 06 55 12 42 94 18 44 67 2 06 12 55 42 94 18 44 67 3 06 12 18 42 94 55 44 67 4 5 6 7 Java 29

Método de Ordenación: selección Or 44 55 12 42 94 18 06 67 1 06 55 12 42 94 18 44 67 2 06 12 55 42 94 18 44 67 3 06 12 18 42 94 55 44 67 4 06 12 18 42 94 55 44 67 5 06 12 18 42 44 55 94 67 6 06 12 18 42 44 55 94 67 7 06 12 18 42 44 55 67 94 Java 30

Método de Ordenación: selección public class OrdSeleccion { public static void main(string args[]) { double data[]={321,123,213,234,1,4,5,6}; //Array a ordenar for (int sinord = 0; sinord < data.length - 1; sinord ++) { int minpos = sinord ; // Halla la posición del mínimo for (int i = sinord + 1; i < data.length; i++) { if (data[i] < data[minpos]) { minpos = i; } } if (minpos!= sinord ) { double temp = data[minpos]; data[minpos] = data[sinord ]; data[sinord ] = temp; } // Intercambio } for (int i = 0; i < data.length; i++) { //Imprime array orden System.out.println(data[i]); } } } Java 31

Método de Ordenación: Quicksort Se basa en el hecho que los intercambios deben ser realizados preferentemente sobre distancias grandes. El algoritmo (técnica de dividir y vencer) simplificado es: Seleccionar un elemento del array (elemento pivote, p.e. el que se encuentra en la mitad). Todos los elementos menores al pivote se colocan en un array y los mayores en otro. Se aplica el mismo procedimiento de forma recursiva, sobre los subarrays hasta que solo exista un elemento. La complejidad del algoritmo es O(n logn). Java 32

Método de Ordenación: Quicksort División del array 44 55 12 42 94 18 06 67 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 18 12 42 94 55 44 67 06 18 12 42 94 55 44 67 Java 33

Método de Ordenación: Quicksort 06 18 12 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 Java 34

Método de Ordenación: Quicksort public class OrdQuicksort { public static void main(string args[]) { double data[]={321,123,213,234,1,4,5,6}; //Array a ordenar //Invocacion metodo ordenacion quicksort(data, 0, data.length-1); } //Imprime el contenido del array ordenado for (int i = 0; i < data.length; i++) { System.out.println(data[i]); } Java 35

Método de Ordenación: Quicksort static void quicksort(double data[], int izq, int der) { int i = izq, j = der; } } double pivote = data[izq + (der-izq)/2]; //elem. pivote (mitad) // Division en dos subarrays while (i <= j) { while (data[i] < pivote) i++; //valores menores al pivote while (data[j] > pivote) j--; //valores mayores al pivote if (i <= j) { // intercambiar y seguir double tmp = data[i]; data[i] = data[j]; data[j] = tmp; i++; j--; } } if (izq < j) quicksort(data, izq, j); // Recursion subarray < if (i < der) quicksort(data, i, der); // Recursion subarray > Java 36