Está en la página 1de 15

INSTITUTO POLITECNICO NACIONAL

UNIDAD PROFESIONAL INTERDICIPLINARIA DE


INGENIERIA Y CIENCIAS SOCIALES Y
ADMINISTRATIVAS

ESTRUCTURA Y REPRESENTACION DE DATOS

ALEJANDRE RIVERA GERARDO ADONAY

2020600048

1CM21
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

Algoritmo de ordenamiento
En computación y matemáticas un algoritmo de ordenamiento es un algoritmo que pone
elementos de una lista o un vector en una secuencia dada por una relación de orden, es
decir, el resultado de salida ha de ser una permutación —o reordenamiento— de la
entrada que satisfaga la relación de orden dada. Las relaciones de orden más usadas son
el orden numérico y el orden lexicográfico.
Ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos
(como los de búsqueda y fusión) que requieren listas ordenadas para una ejecución
rápida. También es útil para poner datos en forma canónica y para generar resultados
legibles por humanos.

Desde los comienzos de la computación, el problema del ordenamiento ha atraído gran


cantidad de investigación, tal vez debido a la complejidad de resolverlo eficientemente a
pesar de su planteamiento simple y familiar.
Por ejemplo, BubbleSort fue analizado desde 1956.1 Aunque muchos puedan
considerarlo un problema resuelto, nuevos y útiles algoritmos de ordenamiento se siguen
inventado hasta el día de hoy (por ejemplo, el ordenamiento de biblioteca se publicó por
primera vez en el 2004). Los algoritmos de ordenamiento son comunes en las clases
introductorias a la computación, donde la abundancia de algoritmos para el problema
proporciona una gentil introducción a la variedad de conceptos núcleo de los algoritmos,
como notación de O mayúscula, algoritmos divide y vencerás, estructuras de datos,
análisis de los casos peor, mejor, y promedio, y límites inferiores.

Clasificación
Los algoritmos de ordenamiento se pueden clasificar en las siguientes maneras:

La más común es clasificar según el lugar donde se realice la ordenación


Algoritmos de ordenamiento interno: en la memoria del ordenador.
Algoritmos de ordenamiento externo: en un lugar externo como un disco duro.
Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o
inversamente ordenadas:
Algoritmos de ordenación natural: Tarda lo mínimo posible cuando la entrada está
ordenada.
Algoritmos de ordenación no natural: Tarda lo mínimo posible cuando la entrada está
inversamente ordenada.
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21
Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenían
originalmente los elementos con claves iguales. Por ejemplo, si una lista ordenada por
fecha se reordena en orden

alfabético con un algoritmo estable, todos los elementos cuya clave alfabética sea la
misma quedarán en orden de fecha. Otro caso sería cuando no interesan las mayúsculas
y minúsculas, pero se quiere que si una clave aBC estaba antes que AbC, en el resultado
ambas claves aparezcan juntas y en el orden original: aBC, AbC. Cuando los elementos
son indistinguibles (porque cada elemento se ordena por la clave completa) la estabilidad
no interesa. Los algoritmos de ordenamiento que no son estables se pueden implementar
para que sí lo sean. Una manera de hacer esto es modificar artificialmente la clave de
ordenamiento de modo que la posición original en la lista participe del ordenamiento en
caso de coincidencia.

Los algoritmos se distinguen por las siguientes características:

Complejidad computacional (peor caso, caso promedio y mejor caso) en términos de n, el


tamaño de la lista o arreglo. Para esto se usa el concepto de orden de una función y se
usa la notación O(n). El mejor comportamiento para ordenar (si no se aprovecha la
estructura de las claves) es O(n log n). Los algoritmos más simples son cuadráticos, es
decir O(n²). Los algoritmos que aprovechan la estructura de las claves de ordenamiento
(p. ej. bucket sort) pueden ordenar en O(kn) donde k es el tamaño del espacio de claves.
Como dicho tamaño es conocido a priori, se puede decir que estos algoritmos tienen un
desempeño lineal, es decir O(n).
Uso de memoria y otros recursos computacionales. También se usa la notación O(n).
Estabilidad
Los algoritmos de ordenamiento estable mantienen un relativo preorden total. Esto
significa que un algoritmo es estable solo cuando hay dos registros R y S con la misma
clave y con R apareciendo antes que S en la lista original.

Cuando elementos iguales (indistinguibles entre sí), como números enteros, o más
generalmente, cualquier tipo de dato en donde el elemento entero es la clave, la
estabilidad no es un problema. De todas formas, se asume que los siguientes pares de
números están por ser ordenados por su primer componente:

(4, 1) (3, 7) (3, 1) (5, 6)


En este caso, dos resultados diferentes son posibles, uno de los cuales mantiene un
orden relativo de registros con claves iguales, y una en la que no:
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

(3, 7) (3, 1) (4, 1) (5, 6) (orden mantenido)


(3, 1) (3, 7) (4, 1) (5, 6) (orden cambiado)

Los algoritmos de ordenamiento inestable pueden cambiar el orden relativo de registros


con claves iguales, pero los algoritmos estables nunca lo hacen. Los algoritmos inestables
pueden ser implementados especialmente para ser estables.
Una forma de hacerlo es extender artificialmente el cotejamiento de claves, para que las
comparaciones entre dos objetos con claves iguales sean decididas usando el orden de
las entradas original. Recordar este orden entre dos objetos con claves iguales es una
solución poco práctica, ya que generalmente acarrea tener almacenamiento adicional.

Ordenar según una clave primaria, secundaria, terciara, etc., puede ser realizado
utilizando cualquier método de ordenamiento, tomando todas las claves en consideración
(en otras palabras, usando una sola clave compuesta).
Si un método de ordenamiento es estable, es posible ordenar múltiples ítems, cada vez
con una clave distinta. En este caso, las claves necesitan estar aplicadas en orden de
aumentar la prioridad.

Ejemplo: ordenar pares de números, usando ambos valores

(4, 1) (3, 7) (3, 1) (4, 6) (original)


(4, 1) (3, 1) (4, 6) (3, 7) (después de ser ordenado por el segundo valor)
(3, 1) (3, 7) (4, 1) (4, 6) (después de ser ordenado por el primer valor)
Por otro lado:

(3, 7) (3, 1) (4, 1) (4, 6) (después de ser ordenado por el primer valor)
(3, 1) (4, 1) (4, 6) (3, 7) (después de ser ordenando por el segundo valor, el orden por el
primer valor es perturbado)
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

Lista de algoritmos de ordenamiento


Algunos algoritmos de ordenamiento agrupados según estabilidad tomando en cuenta
la complejidad computacional.

Estables

Nombre
Nombre traducido Complejidad Memoria Método
original

Ordenamiento de
Bubblesort O(n²) O(1) Intercambio
burbuja

Ordenamiento de
burbuja Cocktail sort O(n²) O(1) Intercambio
bidireccional

Ordenamiento por O(n²)("(en el peor de los


Insertion sort O(1) Inserción
inserción casos)")

Ordenamiento por No
Bucket sort O(n) O(n)
casilleros comparativo

Ordenamiento por No
Counting sort O(n+k) O(n+k)
cuentas comparativo

Ordenamiento por
Merge sort O(n log n) O(n) Mezcla
mezcla

Ordenamiento con Binary tree


O(n log n) O(n) Inserción
árbol binario sort

Pigeonhole
O(n+k) O(k)
sort
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

Ordenamiento No
Radix sort O(nk) O(n)
Radix comparativo

Distribution
O(n³) versión recursiva O(n²)
sort

Gnome sort O(n²) O(1)

Inestables

Nombre
Nombre traducido Complejidad Memoria Método
original

Ordenamiento
Shell sort O(n1.25) O(1) Inserción
Shell

Comb sort O(n log n) O(1) Intercambio

Ordenamiento por
Selection sort O(n²) O(1) Selección
selección

Ordenamiento por
Heapsort O(n log n) O(1) Selección
montículos

Smoothsort O(n log n) O(1) Selección

Ordenamiento Promedio: O(n log n),
Quicksort O(log n) Partición
rápido peor caso: O(n²)

Several Promedio: O(n u),
Unique Sort peor caso: O(n²);
u=n; u = número único
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

de registros

Cuestionables, imprácticos

Nombre
Nombre traducido Complejidad Memoria Método
original

O(n × n!), peor: no
Bogosort
termina

O(n), excepto en
Pancake
máquinas de Von
sorting
Neumann

Ordenamiento Promedio: O(n!) Peor:


Randomsort
Aleatorio No termina

ESTABLES:

La Ordenación de burbuja (Bubble Sort en inglés)


Es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista
que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el
orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se
necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo
obtiene su nombre de la forma con la que suben por la lista los elementos durante los
intercambios, como si fueran pequeñas "burbujas". También es conocido como el método
del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo
considera un algoritmo de comparación, siendo uno de los más sencillos de implementar.

El ordenamiento de burbuja bidireccional (cocktail sort en inglés)


Es un algoritmo de ordenamiento que surge como una mejora del algoritmo ordenamiento
de burbuja.
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

Ejemplo de la operativa paso a paso


La manera de trabajar de este algoritmo es ir ordenando al mismo tiempo por los dos
extremos del vector. De manera que tras la primera iteración, tanto el menor como el
mayor elemento estarán en sus posiciones finales. De esta manera se reduce el número
de comparaciones aunque la complejidad del algoritmo sigue siendo O(n²).

Hacemos un recorrido ascendente (del primer elemento al último), cogemos el primer


elemento y lo comparamos con el siguiente, si el siguiente es menor lo pasamos al puesto
anterior, de esta forma al final de la lista nos queda el mayor. Una vez terminada la serie
ascendente, hacemos un recorrido descendente (del último elemento al primero) pero
esta vez nos quedamos con los menores a los que vamos adelantando posiciones en vez
de retrasarlas como hicimos en la serie ascendente. Repetimos las series
alternativamente pero reduciendo el ámbito en sus extremos pues ya tendremos allí los
valores más bajos y más altos de la lista, hasta que no queden elementos en la serie; en
el pseudocódigo de ejemplo: Hasta (izq > der).

El ordenamiento por inserción (insertion sort en inglés)


Es una manera muy natural de ordenar para un ser humano, y puede usarse fácilmente
para ordenar un mazo de cartas numeradas en forma arbitraria. Requiere O(n²)
operaciones para ordenar una lista de n elementos.

Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado.


Después, cuando hay k elementos ordenados de menor a mayor, se toma el elemento
k+1 y se compara con todos los elementos ya ordenados, deteniéndose cuando se
encuentra un elemento menor (todos los elementos mayores han sido desplazados una
posición a la derecha) o cuando ya no se encuentran elementos (todos los elementos
fueron desplazados y este es el más pequeño). En este punto se inserta el elemento k+1
debiendo desplazarse los demás elementos.

El ordenamiento por casilleros (bucket sort o bin sort, en inglés)


Es un algoritmo de ordenamiento que distribuye todos los elementos a ordenar entre un
número finito de casilleros. Cada casillero sólo puede contener los elementos que
cumplan unas determinadas condiciones. En el ejemplo esas condiciones son intervalos
de números. Las condiciones deben ser excluyentes entre sí, para evitar que un elemento
pueda ser clasificado en dos casilleros distintos. Después cada uno de esos casilleros se
ordena individualmente con otro algoritmo de ordenación (que podría ser distinto según el
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21
casillero), o se aplica recursivamente este algoritmo para obtener casilleros con menos
elementos. Se trata de una generalización del algoritmo Pigeonhole sort. Cuando los
elementos a ordenar están uniformemente distribuidos la complejidad computacional de
este algoritmo es de O(n).

El algoritmo contiene los siguientes pasos:

Crear una colección de casilleros vacíos


Colocar cada elemento a ordenar en un único casillero
Ordenar individualmente cada casillero
devolver los elementos de cada casillero concatenados por orden

El ordenamiento por cuentas (counting sort en inglés)


Es un algoritmo de ordenamiento en el que se cuenta el número de elementos de cada
clase para luego ordenarlos. Sólo puede ser utilizado por tanto para ordenar elementos
que sean contables (como los números enteros en un determinado intervalo, pero no los
números reales, por ejemplo).

El primer paso consiste en averiguar cuál es el intervalo dentro del que están los datos a
ordenar (valores mínimo y máximo). Después se crea un vector de números enteros con
tantos elementos como valores haya en el intervalo [mínimo, máximo], y a cada elemento
se le da el valor 0 (0 apariciones). Tras esto se recorren todos los elementos a ordenar y
se cuenta el número de apariciones de cada elemento (usando el vector que hemos
creado). Por último, basta con recorrer este vector para tener todos los elementos
ordenados.

El algoritmo de ordenamiento por mezcla (merge sort en inglés)


Es un algoritmo de ordenamiento externo estable basado en la técnica divide y vencerás.
Es de complejidad O(n log n).

El ordenamiento con árbol binario es un algoritmo de ordenamiento, el cual ordena sus


elementos haciendo uso de un árbol binario de búsqueda. Se basa en ir construyendo
poco a poco el árbol binario introduciendo cada uno de los elementos, los cuales
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21
quedarán ya ordenados. Después, se obtiene la lista de los elementos ordenados
recorriendo el árbol en inorden.

En informática, el ordenamiento Radix (radix sort en inglés)


Es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma
individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo,
nombres o fechas) y, especialmente, números en punto flotante especialmente
formateados, radix sort no está limitado sólo a los enteros.

INESTABLES:

El ordenamiento Shell (Shell sort en inglés)


Es un algoritmo de ordenamiento. El método se denomina Shell en honor de su inventor
Donald Shell. Su implementación original, requiere O(n2) comparaciones e intercambios
en el peor caso. Un cambio menor presentado en el libro de V. Pratt produce una
implementación con un rendimiento de O(n log2 n) en el peor caso. Esto es mejor que las
O(n2) comparaciones requeridas por algoritmos simples pero peor que el óptimo O(n log
n). Aunque es fácil desarrollar un sentido intuitivo de cómo funciona este algoritmo, es
muy difícil analizar su tiempo de ejecución.

El Shell sort es una generalización del ordenamiento por inserción, teniendo en cuenta
dos observaciones:

El ordenamiento por inserción es eficiente si la entrada está "casi ordenada".


El ordenamiento por inserción es ineficiente, en general, porque mueve los valores sólo
una posición cada vez.
El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos
separados por un espacio de varias posiciones. Esto permite que un elemento haga
"pasos más grandes" hacia su posición esperada. Los pasos múltiples sobre los datos se
hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21
un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los
datos del vector están casi ordenados.

El ordenamiento por selección (Selection Sort en inglés)


Es un algoritmo de ordenamiento que requiere O{\displaystyle (n^{2})}{\displaystyle
(n^{2})} operaciones para ordenar una lista de n elementos.

El ordenamiento por montículos (heapsort en inglés)


Es un algoritmo de ordenamiento no recursivo, no estable, con complejidad computacional
{\displaystyle \Theta (n\log n)}{\displaystyle \Theta (n\log n)}.

Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un
montículo (heap), y luego extraer el nodo que queda como nodo raíz del montículo (cima)
en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en
una propiedad de los montículos, por la cual, la cima contiene siempre el menor elemento
(o el mayor, según se haya definido el montículo) de todos los almacenados en él. El
algoritmo, después de cada extracción, recoloca en el nodo raíz o cima, la última hoja por
la derecha del último nivel. Lo cual destruye la propiedad heap del árbol. Pero, a
continuación realiza un proceso de "descenso" del número insertado de forma que se
elige a cada movimiento el mayor de sus dos hijos, con el que se intercambia. Este
intercambio, realizado sucesivamente "hunde" el nodo en el árbol restaurando la
propiedad montículo del árbol y dejando paso a la siguiente extracción del nodo raíz.

El algoritmo, en su implementación habitual, tiene dos fases. Primero una fase de


construcción de un montículo a partir del conjunto de elementos de entrada, y después,
una fase de extracción sucesiva de la cima del montículo. La implementación del almacén
de datos en el heap, pese a ser conceptualmente un árbol, puede realizarse en un vector
de forma fácil. Cada nodo tiene dos hijos y por tanto, un nodo situado en la posición i del
vector, tendrá a sus hijos en las posiciones 2 x i, y 2 x i +1 suponiendo que el primer
elemento del vector tiene un índice = 1. Es decir, la cima ocupa la posición inicial del
vector y sus dos hijos la posición segunda y tercera, y así, sucesivamente. Por tanto, en la
fase de ordenación, el intercambio ocurre entre el primer elemento del vector (la raíz o
cima del árbol, que es el mayor elemento del mismo) y el último elemento del vector que
es la hoja más a la derecha en el último nivel. El árbol pierde una hoja y por tanto reduce
su tamaño en un elemento. El vector definitivo y ordenado, empieza a construirse por el
final y termina por el principio.

El ordenamiento rápido (quicksort en inglés)


ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21
Es un algoritmo de ordenacion creado por el científico británico en computación C. A. R.
Hoare.

IMPLEMENTACION:
Para ordenar arrays tenemos a nuestra disposición diferentes tipos de algoritmos para
hacerlo. Hay lo que se llaman formas naturales de ordenación y las que no lo son. El
método de la burbuja es un método de ordenación no natural para ordenar arrays.
Consiste en ir recorriendo todo el array a ordenar, comparando dos elementos al mismo
tiempo e intercambiándolos si no están en el lugar apropiado. Al finalizar el recorrido por
todos los elementos, se determina si hubo algún cambio, y en caso afirmativo, se repite el
algoritmo hasta que no haya cambio alguno.

De todas formas si quieres profundizar en el tema de algoritmos de ordenación, puedes


visitar los apuntes (de mi universidad) que tengo subidos sobre ello.

El nombre que se le atribuye viene porque al hacer el intercambio, los elementos más
pequeños “burbujean” de forma progresiva hasta el inicio del array, mientras que los más
grandes se “hunden”. Es el algoritmo de ordenación por comparación más sencillo de
implementar.

En cuanto al rendimiento, el algoritmo no destaca por su rapidez. Es de los más pobres


en rendimiento y sobre todo no es recomendable usarlo en arrays largos. Sin embargo,
está bastante bien si estás empezando ya que se caracteriza por su sencillez.

En concreto el ejemplo que voy a mostrar a continuación es el código para ordenar un


array de mayor a menor, sin embargo para ordenador de menor a mayor solo habría que
cambiar uno de los signos que comento en el código.
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

1 #include <iostream>
2 using namespace std;
3 #include <cstdlib>
4  
5 int const DIM = 10;
6 typedef float tArray[DIM];
7  
8 void rellenarArray(tArray);
9 void ordenarArray(tArray);
10 void mostrarArray(const tArray);
11  
12 int main(){
13 tArray miArray;
14
15 rellenarArray(miArray);
16 ordenarArray(miArray);
17 mostrarArray(miArray);
18
19 system("PAUSE");
20 return 0;
21 }
22  
23 void rellenarArray(tArray miArray){
24 cout << "Introduzca los 10 elementos del array" << endl;
25
26 for (int i = 0; i < DIM; i++){ // Rellenamos las 10 posiciones del array
27 cin >> miArray[i];
28 }
29 }
30  
31 void ordenarArray(tArray miArray){
32 float temporal;
33
34 for (int i = 0;i < DIM; i++){
35 for (int j = 0; j< DIM-1; j++){
36 if (miArray[j] < miArray[j+1]){ // Ordena el array de mayor a menor, cambiar el "<" a
37 ">" para ordenar de menor a mayor
38 temporal = miArray[j];
39 miArray[j] = miArray[j+1];
40 miArray[j+1] = temporal;
41 }
42 }
43 }
44 }
45  
46 void mostrarArray(const tArray miArray){
47 cout << "Mostrando array ordenado..." << endl;
48
49 for (int i = 0; i < DIM; i++) // Imprime las 10 posiciones
50 cout << miArray[i] << endl;
ALEJANDRE RIVERA GERARDO ADONAY
2020600048
ESTRUCTURA Y REPRESENTACION DE DATOS
1CM21

1
2
3
4
5 //Ordena el número de números que usted quiera.
//Codificado por: Danny Henderson
6 ??=include<iostream>
7 using namespace std;
8 int main()
??<
9     int i,j,k,cn;
10     int n??('cn'??);
    cout<<"Cantidad de numeros que desea Ingresar: ";cin>>cn;
11
 
12     for(i=0;i<cn;i++)
13     {
        cout<<"Ingrese  numero "<<i+1<<" : ";
14         cin>>n[i];
15     }
16  
    for(i=1;i<cn;i++)
17     {
18         for(j=0;j<cn-i;j++)
19         {
            if(n[j]>n[j+1])
20             {k=n[j+1]; n[j+1]=n[j]; n[j]=k;}
21         }
    }
22
23  
    for(i=0;i<cn;i++)
24     {
25         cout<<n[i]<<endl;
    }
26     cin.ignore(); return 0;
27 ??>
28
29
30
31

También podría gustarte