Enviado por Rolf Pinto López
El ordenamiento es una labor común que realizamos cotidianamente, es un proceso tan común en nuestras vidas que no nos detenemos a meditar mucho en ello. Ordenar es meramente colocar información de una manera especial basándonos en un criterio de ordenamiento.
En la ciencia de la computación el ordenamiento de datos también cumple un rol muy importante, ya sea como un fin en sí o como parte de otros procedimientos más complejos. Se han desarrollado muchas técnicas en este ámbito, cada una con características específicas, y con ventajas y desventajas sobre las demás. El propósito principal de un ordenamiento es el de facilitar la búsqueda de información.
El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso alfanumérico, ascendente o descendente.
Antes de comenzar a ver cada algoritmo vamos a ponernos de acuerdo en algunos conceptos, para que no haya confusiones:
Cuando se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo.
Al estudiar algoritmos de todo tipo, no sólo de ordenamiento, es bueno tener una forma de evaluarlos antes de pasarlos a código. De esta manera podremos decidir cuál se adapta mejor a los requerimientos de nuestro programa. Así que veamos estos aspectos:
(Nombre, Edad)
Pedro 19, Juan 23, Felipe 15, Marcela 20, Juan 18, Marcela 17
Ordenada alfabéticamente por el nombre con un algoritmo estable quedaría así:
Felipe 15, Marcela 20, Marcela 17, Juan 23, Juan 18, Pedro 19
Un algoritmo no estable podría dejar a Juan 18 antes de Juan 23, o a Marcela 20 después de Marcela 17.
Los datos a ordenar están en memoria la principal RAM, por lo que se asume que el tiempo que se requiere para acceder cualquier elemento sea el mismo.
|
Inserción Directa |
Inserción Directa |
|
Inserción Binaria |
|
|
Selección Directa |
Selección Directa |
|
Intercambio Directo |
Burbuja |
|
Shake |
|
|
Inserción Disminución Incremental |
Shell |
|
Ordenamiento De Árbol |
Heap |
|
Tournament |
|
|
Sort Particionado |
Quick Sort |
|
Merge Sort |
|
|
Radix Sort |
|
|
Cálculo De Dirección |
|
Los datos a ordenar están en la memoria secundaria, es decir, disco duro, disco extraíble, por lo que se asume que el tiempo que se requiere para acceder a cualquier elemento depende de la última posición consultada.
|
Straight Merging |
|
Natural Merging |
|
Balanced Multiway Merging |
|
Polyphase Sort |
|
Distribution Of Initial Runs |
Clasificación de los algoritmos de ordenamiento
|
Algoritmos de inserción: |
Inserción Binaria Hashing |
|
Algoritmos de intercambio: |
|
|
Algoritmos de selección: |
|
|
Algoritmos de enumeración: |
Los métodos simples son: Inserción Directa, Selección, Burbuja y Shell, en dónde el último es una extensión al método de Inserción, siendo más rápido. Los métodos más complejos son Quick Sort y Heap.
Bubble Sort recorre el arreglo intercambiando los elementos adyacentes que estén desordenados. Recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente lo que hace es tomar el elemento mayor y lo coloca en las últimas posiciones o tomar el menor y colocarlo en las primeras posiciones.
ALGORITMO BURBUJA
INICIO
ENTERO X, Z, ARREGLO[N]
X ß 0
MIENTRAS(X < N)
{
Z ß N
MIENTRAS(Z >= 0)
{
SI(ARREGLO[Z] < ARREGLO[Z-1])
{
INTERCAMBIO(ARREGLO[Z],ARREGLO[Z-1])
}
Z ß Z – 1
}
X ß X + 1
}
FIN
void burbuja(void)
{
int x, z, aux, ARREGLO[N];
x = 0;
while(x < N)
{
z = N;
while(z >= 0)
{
if(ARREGLO[z] < ARREGLO[z - 1])
{
aux = ARREGLO[z];
ARREGLO[z] = ARREGLO[z - 1];
ARREGLO[z - 1] = aux;
}
z--;
}
x++;
}
}
Tiempo de ejecución: El ciclo interno se ejecuta n veces. El ciclo externo también se ejecuta n veces, la complejidad es n * n = O(n2). El comportamiento del caso promedio depende del orden de entrada de los datos, pero es sólo un poco mejor que el del peor caso, y sigue siendo O(n2).
Estabilidad: No intercambia registros con claves iguales.
Ventajas:
Desventajas:
Este método consiste en insertar un elemento en una parte ya ordenada del vector y comenzar de nuevo con los elementos restantes. Este también es un algoritmo lento, pero puede ser de utilidad para listas semiordenadas, pues en ese caso realiza pocos desplazamientos.
ALGORITMO INSERCIÓN
INICIO
ENTERO X, Z, AUX, ARREGLO[N]
LOGICO B
PARA(X ß 1, HASTA N, X ß X + 1)
{
AUX ß ARRAY[X]
Z ß X - 1
B ß FALSO
MIENTRAS(B = FALSO Y Z >= 0)
{
SI(AUX < ARREGLO[Z])
{
ARREGLO[Z + 1] ß ARREGLO[Z]
Z ß Z – 1
}
SI NO
{
B ß VERDAD
}
}
ARREGLO[Z + 1] ß AUX
}
FIN
void insercion(void)
{
int x,z, aux, ARREGLO[N];
bool b;
for(x = 1; x < N; x++)
{
aux = ARREGLO[x];
z = x - 1;
flag = false;
while(b == false && z >= 0)
{
if(aux < ARREGLO[z])
{
ARREGLO[z + 1] = ARREGLO[z];
z--;
}
else
b = true;
}
ARREGLO[z + 1] = aux;
}
}
Ejemplo:
|
[0] |
15 |
15 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
10 |
7 |
|
[1] |
10 |
ð 15 |
15 |
15 |
15 |
14 |
14 |
14 |
14 |
11 |
11 |
11 |
11 |
ð 10 |
10 |
|
[2] |
14 |
14 |
14 |
ð 15 |
15 |
15 |
15 |
ð 14 |
14 |
14 |
14 |
14 |
ð 11 |
11 |
11 |
|
[3] |
11 |
11 |
11 |
11 |
11 |
11 |
ð 15 |
15 |
15 |
15 |
15 |
ð 14 |
14 |
14 |
14 |
|
[4] |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
ð 15 |
15 |
15 |
15 |
15 |
|
ê |
ê |
ê |
ê |
ê |
|||||||||||
|
X |
1 |
2 |
3 |
4 |
5 |
||||||||||
|
Z |
0 |
-1 |
1 |
0 |
2 |
1 |
0 |
3 |
2 |
1 |
0 |
-1 |
4 |
||
|
B |
F |
F |
T |
F |
T |
F |
F |
||||||||
|
AUX |
10 |
14 |
11 |
7 |
? |
Tiempo de Ejecución: Para una lista de n elementos el ciclo externo se ejecuta n-1 veces. El ciclo interno se ejecuta como máximo 1, 2, 3 veces a la tercera iteración, etc., esto tratándose del pero caso posible. Esto produce una complejidad O(n2).
Estabilidad: No intercambia registros con claves iguales. Por lo tanto es estable.
Ventajas:
Desventajas:
Ingrese el e-mail y contraseña con el que está registrado en Monografias.com
Trabajos relacionados
Ver mas trabajos de Programacion |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.
Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.