Está en la página 1de 24

Conceptos básicos.

Ordenación por inserción

El propósito de esta primera lectura es contar con bases para operativizar el


ordenamiento y la búsqueda en lenguaje de programación Java. En este sentido, los
algoritmos de ordenamiento permiten, tal como su nombre lo dice, ordenar,
especialmente vectores o matrices con valores asignados aleatoriamente. De este
modo, se presentarán ventajas y desventajas de los métodos, de manera que el
programador pueda ir desarrollando criterios propios sobre las estrategias a emplear
en un problema o situación dada.

Ordenamiento. Conceptos básicos

Efectividad y complejidad de los algoritmos de ordenamiento

Métodos directos de ordenación: aspectos generales

De nición de términos básicos

Referencias
Lección 1 de 5

Ordenamiento. Conceptos básicos

La ordenación o clasificación de datos (sort, en inglés) es una operación


consistente en disponer un conjunto —estructura— de datos en algún
determinado orden con respecto a uno de los campos de elementos del
conjunto. Por ejemplo, cada elemento del conjunto de datos de una guía
telefónica tiene un campo nombre, un campo dirección y un campo número
de teléfono; la guía telefónica está dispuesta en orden alfabético de
nombres; los elementos numéricos se pueden ordenar en orden creciente o
decreciente de acuerdo con el valor numérico del elemento. En terminología
de ordenación, el elemento por el cual está ordenado un conjunto de datos (o
se está buscando) se denomina clave. Una colección de datos (estructura)
puede ser almacenada en un archivo, un array (vector o tabla), un array de
registros, una lista enlazada o un árbol. Cuando los datos están almacenados
en un array, una lista enlazada o un árbol, se denomina ordenación interna. Si
los datos están almacenados en un archivo, el proceso de ordenación se
llama ordenación externa.

Los métodos (algoritmos) de ordenación son numerosos; por este motivo, se


debe prestar especial atención en su elección. ¿Cómo se sabe cuál es el
mejor algoritmo? La eficiencia es el factor que mide la calidad y rendimiento
de un algoritmo. En el caso de la operación de ordenación, dos criterios se
suelen seguir a la hora de decidir qué algoritmo —de entre los que resuelven
la ordenación— es el más eficiente: 1) tiempo menor de ejecución en
computadora; 2) menor número de instrucciones. Sin embargo, no siempre
es fácil efectuar estas medidas: puede no disponerse de instrucciones para
medida de tiempo… Y las instrucciones pueden variar, dependiendo del
lenguaje y del propio estilo del programador. Por esta razón, el mejor criterio
para medir la eficiencia de un algoritmo es aislar una operación específica
clave en la ordenación y contar el número de veces que se realiza.

Por ejemplo, se puede agregar que los algoritmos más simples, como el caso
de Bubble Sort, tienen un orden de complejidad cuadrática O(n2), mientras
que los más eficientes, y también más difíciles de aplicar, tienen una
complejidad cuasi lineal O(n log(n)). En este sentido, Sznajdleder (2012)
sostiene:

Analizamos diferentes métodos de ordenamiento


clasificándolos según su complejidad y llegamos a la conclusión
de que los algoritmos de orden cuadrático no funcionan bien
cuando la cantidad de elementos que se va a ordenar es
elevada. En general, se considera que el algoritmo de
ordenamiento «por excelencia» es Quicksort por ser
relativamente fácil de implementar y extremadamente eficiente.
De hecho, Java provee una implementación de este algoritmo
dentro del método estático Collections.sort. (p. 548).
No obstante, es de gran relevancia estudiar y detallar cada uno de los casos,
de modo de precisar las operaciones y el algoritmo correspondiente y, solo
así, poder estudiar su eficiencia. Por su parte, los métodos de ordenación se
suelen dividir en dos grandes grupos (ver tabla 1).

Tabla 1: Clasificación de los métodos de ordenación

Tipos de métodos Ejemplos


Directos Burbuja, selección, inserción
Indirectos o Shell, ordenación rápida, ordenación por mezcla,
avanzados Radixsort

Fuente: De Lima, 2020.

C O NT I NU A R
Lección 2 de 5

Efectividad y complejidad de los algoritmos de


ordenamiento

La complejidad algorítmica representa la cantidad de recursos (temporales)


que necesita un algoritmo para resolver un problema y, por lo tanto, permite
determinar la eficiencia de dicho algoritmo. Estos recursos pueden ser
traducidos en tiempo y memoria. El tiempo se calcula por el coste del
tamaño de los datos, teniendo en cuenta el esperado, el promedio y el mejor.
Si el tamaño de los datos es grande, lo que importa es el comportamiento
asintótico de la eficiencia.

Tabla 2: Análisis de algoritmos de ordenamiento

Orden Nombre Comentario


O(1) Constante Se aplica a los algoritmos cuya
ejecución se realice en un tiempo
constante
O(log n) Logarítmico Están considerados los que
implican bucles con menos
iteraciones como, por ejemplo,
una búsqueda binaria.
O(n) lineal En este tipo de notación, el
tiempo crece linealmente con
respecto a las iteraciones.
O(n·log(n)) n por logaritmo de La mayor parte de los algoritmos
n tienen un orden superior, combina
el logarítmico con el lineal.

O(nc), con c>1 polinómico Aquí están muchos de los


algoritmos más comunes.
Cuando c es 2 se le llama
cuadrático, cuando es 3 se le
llama cúbico, y en general es
polinómico.
O(cn), con c>1 exponencial Aunque pudiera no parecerlo, es
mucho peor que el anterior. Crece
muchísimo más rápidamente.
O(n!) factorial Se prueban todas las
combinaciones posibles.

Fuente: Hernández Hernández, Melgarejo Salgado y Salvador Ginez, 2017, p. 5.

C O NT I NU A R
Lección 3 de 5

Métodos directos de ordenación: aspectos generales

Ordenación por selección


Este método considera que el array está formado por dos partes: una parte
ordenada (la izquierda), que estará vacía al principio y, al final, comprende
todo el array; y una parte desordenada (la derecha) que, al principio,
comprende todo el array y al final estará vacía. El algoritmo toma elementos
de la parte derecha y los coloca en la parte izquierda; empieza por el menor
elemento de la parte desordenada y lo intercambia con el que ocupa su
posición en la parte ordenada. Así, en la primera iteración se busca el menor
elemento y se intercambia con el que ocupa la posición 0; en la segunda, se
busca el menor elemento entre la posición 1 y el final, y se intercambia con el
elemento en la posición 1. De esta manera, las dos primeras posiciones del
array están ordenadas y contienen los dos elementos menores dentro del
array. Este proceso continúa hasta ordenar todos los elementos del array.

Figura 1: Método de ordenamiento por selección

/*

*ejemplo8_6.c
*/

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#define TAM 100

void imprimeCB(int *CB) {

int i;

for(i = 0; i < TAM-1; i++) {

printf( "%d, ", CB[i]);

printf( "%d\n", CB[i]);

int main() {
int CB[TAM];

int e,i,PosMenor,aux;

srand((unsigned int)time(NULL));

for(e = 0; e < TAM; e++)

CB[e] = (int)(rand() % 100);

printf( "Antes de ordenar\n-----------------------\n");

imprimeCB(CB);

for (e=0; e<(TAM-1) ; e++) {

PosMenor=e;

for (i=e+1;i<TAM;i++)

if (CB[i]<CB[PosMenor])

PosMenor=i;

aux=CB[e];
CB[e]=CB[PosMenor];

CB[PosMenor]=aux;

Fuente: De Lima, 2020.

Ordenación burbuja
Se basa en recorrer el array («realizar una pasada») un cierto número de
veces, comparando pares de valores que ocupan posiciones adyacentes (0-
1,1-2, etc.). Si ambos datos no están ordenados, se intercambian. Esta
operación se repite n-1 veces, y es el tamaño del conjunto de datos de
entrada. Al final de la última pasada, el elemento mayor estará en la última
posición; en la segunda, el segundo elemento llegará a la penúltima, y así
sucesivamente.

Su nombre se debe a que el elemento cuyo valor es mayor sube a la posición


final del array, al igual que las burbujas de aire en un depósito suben a la
parte superior. Para ello, debe realizar un recorrido paso a paso desde su
posición inicial hasta la posición final del array.

Figura 2: Método de ordenamiento burbuja


/*

*ejemplo8_4.c

*/

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#define TAM 100

void imprimeCB(int *CB) {

int i;

for(i = 0; i < TAM-1; i++) {

printf( "%d, ", CB[i]);

}
printf( "%d\n", CB[i]);

int main() {

int CB[TAM];

int e, i, auxiliar;

srand((unsigned int)time(NULL));

for(e = 0; e < TAM; e++)

CB[e] = (int)(rand() % 100);

printf( "Antes de ordenar\---------------------\n");

imprimeCB(CB);

for(e = 0; e < TAM; e++)

for(i = 0; i < TAM-1-e; i++)


if(CB[i] > CB[i+1]) {

auxiliar = CB[i+1];

CB[i+1] = CB[i];

CB[i] = auxiliar;

printf( "\nDespués de ordenar\n------------------\n");

imprimeCB(CB);

Fuente: De Lima, 2020.

Ordenación por inserción


El método de ordenación por inserción directa consiste en recorrer todo el
array, comenzando desde el segundo elemento hasta el final. Para cada
elemento, se trata de colocarlo en el lugar correcto entre todos los elementos
anteriores a él, o sea, entre los elementos a su izquierda en el array. Dada
una posición actual p, el algoritmo se basa en que los elementos A[0], A[1], ...,
A[p-1] ya están ordenados.
Figura 3: Método de ordenamiento por inserción

public static void insercionDirecta(int A[]){

int p, j;

int aux;

for (p = 1; p < A.length; p++){ // desde el segundo elemento hasta

aux = A[p]; // el final, guardamos el elemento y

j = p - 1; // empezamos a comprobar con el anterior

while ((j >= 0) && (aux < A[j])){ // mientras queden posiciones y el

// valor de aux sea menor que los

A[j + 1] = A[j]; // de la izquierda, se desplaza a

j--; // la derecha

}
A[j + 1] = aux; // colocamos aux en su sitio

Fuente: De Lima, 2020.

Consideraciones del método

En el peor de los casos, el tiempo de ejecución en O(n2).

En el mejor caso (cuando el array ya estaba ordenado), el tiempo de


ejecución de este método de ordenamiento es O(n).

El caso medio dependerá de cómo están inicialmente distribuidos los


elementos. Cuanto más ordenada esté inicialmente, más se acerca a
O(n) y, cuanto más desordenada, más se acerca a O(n2).

En el peor caso el método de inserción directa es igual que en los


métodos de burbuja y selección, pero el mejor caso podemos tener
ahorros en tiempo de ejecución.

C O NT I NU A R
Lección 4 de 5

Definición de términos básicos

Árbol

De acuerdo con Yarleque Ferrer (2018):
Un árbol es una estructura no lineal en la que cada nodo puede
apuntar a uno o varios nodos. También se suele dar una definición
recursiva: un árbol es una estructura compuesta por un dato y
varios árboles. Estas son definiciones simples, pero las
características que implican no lo son tanto. El árbol es una
estructura fundamental de datos en informática, muy utilizada en
todos sus campos, porque se adapta a la representación natural de
informaciones homogéneas organizadas y de una gran comodidad
y rapidez de manipulación. Las estructuras tipo árbol se usan,
principalmente, para representar datos con una relación jerárquica
entre sus elementos como, por ejemplo, árboles genealógicos,
tablas, etc. Un árbol A es un conjunto finito de uno o más nodos:
existe un nodo especial denominado RAIZ (𝑉1) del árbol. Y los
nodos restantes (𝑉2,𝑉3 …,𝑉𝑛 ) se dividen en m >= O conjuntos
disjuntos denominado 𝐴2, …, 𝐴𝑚, cada uno de los cuales es, a su
vez, un árbol. Estos árboles se llaman subárboles de la raíz. (p. 71).

Arreglo o array

Según lo establecen Deitel y Deitel (2012):
Un arreglo es un grupo de variables (llamadas elementos o
componentes) que contienen valores, todos del mismo tipo. Los
arreglos son objetos, por lo que se consideran […] tipos de
referencia […] lo que consideramos, por lo general, […] un arreglo es,
en realidad, una referencia a un objeto arreglo en memoria. Los
elementos de un arreglo pueden ser tipos primitivos o de referencia
(incluyendo arreglos). Para hacer referencia a un elemento
específico en un arreglo, debemos especificar el nombre de la
referencia al arreglo y el número de la posición del elemento en el
arreglo. El número de la posición del elemento se conoce
formalmente como el índice o subíndice del elemento. (p. 242).

Bubble Sort (ordenamiento por burbujeo)



En palabras de Sznajdleder (2012): “El algoritmo de la burbuja consiste en recorrer
el array comparando el valor del i-ésimo elemento con el valor del elemento i+1 y,
si estos se encuentran desordenados, entonces permutarlos.” (p. 530).

Selection sort (ordenamiento por selección)



Por otra parte, Sznajdleder (2012) sostiene:
El algoritmo de ordenamiento por selección es verdaderamente
simple y consiste en recorrer el array buscando el menor elemento
para intercambiarlo con el primero. Luego, recorrer el array, pero
comenzando desde la segunda posición, para buscar el menor
elemento e intercambiarlo por el segundo, y así sucesivamente. (p.
534).
Insertion sort (ordenamiento por inserción)

Pensemos en un array inicialmente vacío. Luego, cualquier
elemento que le agreguemos (llamémosle e1) ocupará la primera
posición y el array estará ordenado. Si agregamos otro elemento
(digamos e2), este deberá ubicarse antes o después de e1 según se
verifique o no que e2 < e1 […]. El algoritmo de ordenamiento por
inserción tiene una complejidad cuadrática O(n2) para el peor de los
casos, pero su rendimiento puede mejorar si el array que queremos
ordenar está parcialmente ordenado. (Sznajdleder, 2012, pp. 535-
536).

Quicksort (ordenamiento rápido)



“Quicksort es un algoritmo relativamente simple y extremadamente eficiente cuya
lógica es recursiva y, según su implementación, puede llegar a requerir el uso de
arrays auxiliares.” (Sznajdleder, 2012, p. 536).

Recursividad

Según lo establece Sznajdleder (2012): “Una definición es recursiva cuando
«define en función de sí misma». Análogamente, diremos que una función es
recursiva cuando, para resolver un problema, se invoca a sí misma una y otra vez
hasta que el problema queda resuelto. (p. 464).

Shellsort (ordenamiento Shell)



Siguiendo a Sznajdleder (2012):
Este método de ordenamiento de complejidad cuadrática para el
peor caso, surge de una generalización del método de
ordenamiento por inserción. El algoritmo consiste en dividir al array
en varios subarrays más pequeños formados por aquellos
elementos del array original que se encuentran separados entre sí
por una determinada «distancia de paso». (p. 544).

Binsort (ordenamiento por cajas)



Este algoritmo consiste en distribuir los elementos del array que
queremos ordenar en diferentes «cajas». Cada caja clasifica los
elementos según una determinada propiedad o condición que,
obviamente, debe ser mutuamente excluyente para asegurar que
cada elemento del array ingrese en una única caja. (Sznajdleder,
2012, p. 545).

Radix sort (ordenamiento de raíz)



Respecto al ordenamiento de raíz, Sznajdleder (2012) afirma:
Radix sort es diferente a todos los otros algoritmos, ya que su
estrategia de ordenamiento es netamente computacional. El
algoritmo permite ordenar un conjunto de valores numéricos en
función del valor ASCII de cada uno de sus dígitos. (p. 548).
Con el fin de complementar esta primera lectura del módulo 4, se
recomienda ampliar la perspectiva con la revisión de las siguientes
publicaciones:

Análisis comparativo de herramientas de recuperación y análisis


de información.pdf
245.9 KB

Fuente: Plasencia-Salgueiro, A. y Ballagas-Flores, B. M. (2014). Análisis comparativo de


herramientas de recuperación y análisis de información de acceso libre desde una concepción
docente. En Transinformação (3)26. Recuperado de https://www.scielo.br/scielo.php?
pid=S010337862014000300315&script=sci_arttext_plus&tlng=es.

Un método para la generación de rankings en la selección de


equipos de trabajo en ambiente competitivo basado en algoritmos
genéticos.pdf
585.8 KB

Fuente: Bello, M., Lázaro, L., García, M. M. y Bello, R. (2016). Un método para la generación de
rankings en la selección de equipos de trabajo en ambiente competitivo basado en algoritmos
genéticos. En Revista Cubana de Ciencias Informáticas (2)10, pp. 196-210. Recuperado de
http://scielo.sld.cu/scielo.php?script=sci_arttext&pid=S2227-18992016000200013.
Se utilizará como medida de su eficiencia el número de comparaciones
entre elementos efectuados.

Verdadero.

Falso.

SUBMIT

¿Los algoritmos de ordenación permutan los elementos del conjunto de


datos hasta conseguir dicho orden?

Verdadero.

Falso.

SUBMIT
C O NT I NU A R
Lección 5 de 5

Referencias

Bello, M., Lázaro, L., García, M. M. y Bello, R. (2016). Un método para la


generación de rankings en la selección de equipos de trabajo en ambiente
competitivo basado en algoritmos genéticos. En Revista Cubana de Ciencias
Informáticas (2)10, pp. 196-210. Recuperado de
http://scielo.sld.cu/scielo.php?script=sci_arttext&pid=S2227-
18992016000200013.

Deitel, P. y Deitel, H. (2012). Cómo programar en Java. Ciudad de México,


México: Editorial Pearson Educación.

Hernández Hernández, M., Melgarejo Salgado, R. y Salvador Ginez, F. R.


(2017). Análisis de Algoritmos de Ordenamiento y Búsqueda. Para la Unidad
de Aprendizaje: Programación Avanzada. Universidad Autónoma del Estado
de México. Recuperado de
http://ri.uaemex.mx/bitstream/handle/20.500.11799/69985/secme3691_1.p
df?sequence=1&isAllowed=y.

Plasencia-Salgueiro, A. y Ballagas-Flores, B. M. (2014). Análisis


comparativo de herramientas de recuperación y análisis de información de
acceso libre desde una concepción docente. En Transinformação (3)26.
Recuperado de https://www.scielo.br/scielo.php?
pid=S010337862014000300315&script=sci_arttext_plus&tlng=es.

Sznajdleder, P. (2012). Algoritmos a fondo: con implementaciones en C y Java.


Buenos Aires, Argentina: Alfaomega Grupo Editor Argentino.

Yarleque Ferrer, R. E. (2018). Estructura de datos. Introducción, conceptos,


tipos de datos, clasificación general, arrays, listas enlazadas, pilas, colas,
inicialización y asignación de valores [monografía]. Universidad Nacional de
Educación Enrique Guzmán y Valle. Facultad de Ciencias. Escuela Profesional
de Matemática e Informática. Recuperado de
https://repositorio.une.edu.pe/bitstream/handle/UNE/3109/MONOGRAF%C3
%8DA%20-%20YARLEQUE%20FERRER.pdf?sequence=1&isAllowed=y.

También podría gustarte