Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
Clasificación
Los algoritmos de ordenamiento se pueden clasificar en las siguientes maneras:
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.
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:
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.
(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
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 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
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
Inestables
Nombre
Nombre traducido Complejidad Memoria Método
original
Ordenamiento
Shell sort O(n1.25) O(1) Inserción
Shell
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
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
ESTABLES:
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.
INESTABLES:
El Shell sort es una generalización del ordenamiento por inserción, teniendo en cuenta
dos observaciones:
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.
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.
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.
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