You are on page 1of 7

ALGORITMOS DE ORDENAMIENTO

Estos algoritmos se basan en dos operaciones:

 Comparación: El algoritmo tiene que poder indicar, dados dos datos cualesquiera, si
están en orden o no.
 Intercambio: El algoritmo tiene que ser capaz de intercambiar dos elementos en el
conjunto de datos.

Con respecto a la comparación, es necesario tener un criterio, ya que es frecuente que una
misma lista de datos sea susceptible de ser ordenada por distintos criterios. Cada aplicación del
algoritmo se hace con un único criterio.

El intercambio implica que los datos están almacenados en una estructura de datos que nos
permite obtener un dato y escribirlo en una posición concreta. La lectura y escritura deben
poder realizarse con un coste constante, o sea, el tiempo que se tarda en leer o escribir el dato
no debe depender de la cantidad de elementos que estemos intentando ordenar. La estructura
preferida para esto es el array (arreglo o vector).

Complejidad

Estos algoritmos se pueden categorizar según el punto de vista de la complejidad temporal.

Cuadrática (O(n^2)): Es la complejidad de los algoritmos más sencillos.

N-Logarítmica (O(n.logn)): Es la complejidad de algunos un poco más avanzados.


Aumentan la complejidad espacial y reducen la
temporal.

Lineales (O(n)): Se aprovechan de alguna característica aritmética para evitar


comparaciones.

ALGORITMOS DE ORDENACIÓN BÁSICOS


Método del burbujeo
Es uno de los métodos más simples. Compara cada elemento contra el elemento siguiente, si se
cumple que el siguiente es menor, se los intercambia de posición y continúa. Esta comparación
se realiza hasta el final de la lista. Una vez terminada, se vuelve a empezar desde el principio, sin
tener en cuenta el último elemento analizado en la última iteración.
En consecuencia, el algoritmo de ordenación de burbuja mejorado contempla dos bucles
anidados: el bucle externo controla la cantidad de pasadas; el bucle interno controla cada
pasada individualmente y cuando se produce un intercambio. El algoritmo terminará, bien
cuando se termine la última pasada (n − 1. La condición para realizar una nueva pasada se define
en la expresión lógica.

La ventaja principal del ordenamiento de burbuja es que es muy popular y fácil de implementar.
La principal desventaja del ordenamiento de burbuja es el hecho de que no se comporta
adecuadamente con una lista que contenga un número grande de elementos. Esto se debe a
que este ordenamiento requiere n al cuadrado de pasos de procesamiento para cada n número
de elementos a ser ordenados. Como tal, este tipo de ordenamiento es más apropiado para la
enseñanza académica pero no para aplicaciones de la vida real.
int aux;
int[] vector = { 50, 20, 40, 80, 30 };
for (int i = vector.Length - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (vector[j] > vector[j + 1])
{
aux = vector[j];
vector[j] = vector[j + 1];
vector[j + 1] = aux;
}
}
}
for (int i = 0; i < vector.Length; i++)
{
Console.WriteLine(vector[i]);
}
Console.ReadLine();

Ordenamiento rápido o Quick-Sort


El ordenamiento rápido funciona según el principio de divide y vencerás. Primero se divide la
lista de elementos en dos sublistas, basado en un elemento pivote (que se puede elegir
aleatoriamente). Una vez que tenemos las dos sublistas, hay que verificar que la lista a la
izquierda del pivote contenga sólo números más pequeños o iguales que el pivote, mientras que
la lista que está a la derecha debe contener sólo número más grandes. El mismo proceso de
partición y organización se realiza repetidamente en las sublistas resultantes, hasta que se
ordena la lista completa de elementos.
El algoritmo quicksort requiere una estrategia de partición y la selección idónea del pivote. Las
etapas fundamentales del algoritmo dependen del pivote elegido aunque la estrategia de
partición suele ser similar.

Su principal ventaja es la eficiencia, ya que puede tratar con una enorme lista de elementos.
Su desventaja, es que su rendimiento (en el peor de los casos) es similar al promedio del
burbujeo, inserción o selección.

Selección Directa
El ordenamiento por selección funciona pasando repetidamente por la lista de elementos, cada
vez seleccionando un elemento según su ordenamiento y colocándolo en la posición correcta
en la secuencia, con respecto a lo que ya está ordenado.

int[] vector = { 6, 5, 3, 1, 8, 7, 2, 4 };
for (int i = 0; i < vector.Length - 1; i++)
{
int posicionMinimo = i;
for (int j = i + 1; j < vector.Length; j++)
{
if (vector[j] < vector[posicionMinimo])
{
posicionMinimo = j;
}
}
if (i != posicionMinimo)
{
int iaux = vector[i];
vector[i] = vector[posicionMinimo];
vector[posicionMinimo] = iaux;
}
}
for (int i = 0; i < vector.Length; i++)
{
Console.WriteLine(vector[i]);
}
Console.ReadLine();

La principal ventaja de este tipo de ordenamiento es que funciona bien con una lista pequeña.
La principal desventaja es su poca eficiencia cuando se trata con una enorme lista de elementos.
Inserción Directa
El bucle principal de la ordenación por inserción va examinando sucesivamente todos los
elementos de la matriz desde el segundo hasta el n-ésimo, e inserta cada uno en el lugar
adecuado entre sus predecesores ordenados dentro de la matriz.

int[] vector = { 6, 5, 3, 1, 8, 7, 2, 4 };
for (int i = 1; i < vector.Length; i++)
{
int valor = vector[i];
int j = i - 1;
while (j >= 0 && vector[j] > valor)
{
vector[j + 1] = vector[j];
j--;
}
vector[j + 1] = valor;
}
for (int i = 0; i < vector.Length; i++)
{
Console.WriteLine(vector[i]);
}
Console.ReadLine();

La principal ventaja de este tipo de ordenamiento es su simplicidad. También exhibe un buen


rendimiento cuando se trabaja con una pequeña lista. Su desventaja es que no funciona tan
bien como otros algoritmos mejores de ordenamiento, este algoritmo no funciona bien con una
lista grande.

ALGORITMOS DE BUSQUEDA
Con mucha frecuencia los programadores trabajan con grandes cantidades de datos
almacenados en arrays y registros, y por ello será necesario determinar si un array contiene un
valor que coincida con un cierto valor clave. El proceso de encontrar un elemento específico de
un array se denomina búsqueda.
Búsqueda secuencial
La búsqueda secuencial busca un elemento de una lista utilizando un valor destino llamado
clave. En una búsqueda secuencial (a veces llamada búsqueda lineal), los elementos de una lista
o vector se exploran (se examinan) en secuencia, uno después de otro.

El algoritmo de búsqueda secuencial compara cada elemento del array con la clave de búsqueda.
Dado que el array no está en un orden prefijado, es probable que el elemento a buscar pueda
ser el primer elemento, el último elemento o cualquier otro. De promedio, al menos el programa
tendrá que comparar la clave de búsqueda con la mitad de los elementos del array. El método
de búsqueda lineal funcionará bien con arrays pequeños o no ordenados. La eficiencia de la
búsqueda secuencial es pobre, tiene complejidad lineal, O(n).

Complejidad de la búsqueda secuencial

La complejidad de la búsqueda secuencial diferencia entre el comportamiento en el caso peor y


mejor. El mejor caso se encuentra cuando aparece una coincidencia en el primer elemento de
la lista y en ese caso el tiempo de ejecución es O(1). El caso peor se produce cuando el elemento
no está en la lista o se encuentra al final de la lista. Esto requiere buscar en todos los n términos,
lo que implica una complejidad de O(n). El caso medio requiere un poco de razonamiento
probabilista. Para el caso de una lista aleatoria es probable que una coincidencia ocurra en
cualquier posición.

Búsqueda binaria
La búsqueda secuencial se aplica a cualquier lista. Si la lista está ordenada, la búsqueda binaria
proporciona una técnica de búsqueda mejorada. Una búsqueda binaria típica es la búsqueda de
una palabra en un diccionario. Dada la palabra, se abre el libro cerca del principio, del centro o
del final dependiendo de la primera letra del primer apellido o de la palabra que busca. Se puede
tener suerte y acertar con la página correcta; pero, normalmente, no será así y se mueve el
lector a la página anterior o posterior del libro.

You might also like