Este documento describe y compara varios algoritmos de ordenamiento comúnmente usados, incluyendo el ordenamiento por burbuja, por inserción y quicksort. Explica cómo funciona cada algoritmo a través de pseudocódigo y código en C++, y analiza su complejidad computacional, siendo quicksort el más eficiente en promedio al ordenar datos en tiempo proporcional a n log n.
INSUMOS QUIMICOS Y BIENES FISCALIZADOS POR LA SUNAT
Algoritmos Ordenamiento
1. Universidad Tenica de Machala. DANIEL GUAYCHA.
Utilitarios I 2014
1
ALGORITMOS DE ORDENAMIENTO
DANIEL G UAYCHA
danielguaycha@gmail.com
Universidad Técnica de Machala
Abstract--The sorting algorithms Basically, as the
name itself says sorting algorithms we used to couple
either order programmers simple large vectors and
matrices with respect to a value that is either or
desendente acendente. To make this work was
focused on programming in c ++ can also say it is a
very powerful language that was born to an endless
number of programs.
I. INTRODUCCIÓN
INTRODUCCIÓN
El ordenamiento es una labor común que realizamos
continuamente. ¿Pero te has preguntado qué es
ordenar? ¿No? Es que es algo tan corriente en
nuestras vidas que no nos detenemos a pensar en
ello. Ordenar es simplemente colocar información
de una manera especial basándonos en un criterio de
ordenamiento.
En 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. Aquí voy a mostrarte
algunas de las más comunes, tratando de hacerlo de
una manera sencilla y comprensible.
Conceptos Preliminares
Antes de comenzar a ver cada algoritmo vamos a
ponernos de acuerdo en algunos conceptos, para que
no haya confusiones:
Clave: La parte de un registro por la cual se
ordena la lista. Por ejemplo, una lista de registros
con campos nombre, dirección y teléfono se puede
ordenar alfabéticamente de acuerdo al nombre. En
este caso los campos dirección y teléfono no se
toman en cuenta en el ordenamiento.
Criterio de ordenamiento o de comparación: El
criterio que utilizamos para asignar orden a los
registros con base en una o más claves. De esta
manera decidimos si un registro es mayor o menor
que otro.
II. ALGORITMOS DE ORDENAMIENTO.
A. Algoritmo Burbuja
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.
PSEUDOCÓDIGO
Algoritmo Burbuja
Inicio
Entero X, Z, Arreglo[N]
X Ss 0
Mientras(X < N){
Z Ss N
Mientras(Z >= 0)
{
Si(Arreglo[Z] < Arreglo[Z-1])
{
Intercambio(Arreglo[Z],Arreglo[Z-1])
}Z Ss Z – 1}
X Ss X + 1}
Fin
PROGRAMACION C++
for (int pasada=0; pasada<n-1 && bandera==1;pasada++)
{
bandera=0;
for (int j=0; j<n-pasada-1;j++)
{if (numeros[j]> numeros[j+1])
{ bandera=1;
mantiene=numeros[j];
numeros[j]=numeros[j+1];
numeros[j+1]=mantiene;
}
}
2. Universidad Tenica de Machala. DANIEL GUAYCHA.
Utilitarios I 2014
2
B. Ordenamiento por inserción
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.
PROGRAMA EN C++
int main() {
const int n=10;
int num[n]={90, 2, 8, 5, 1, 9, 70, 3, 91, 4.};
int i,j;
int aux;
for (int i=1;i<n; i++){
j=i;
aux=num[i];
while(j>0 && aux<num[j-1]){
num[j]=num[j-1];
j--;
}
num[j]=aux;
}
for(int a=0; a<n; a++){
cout<<""<<num[a]<<" ";
}
return 0;
}
C. Ordenamiento quicksort
El ordenamiento rápido (quicksort en inglés) es un
algoritmo creado por el científico británico en
computación C. A. R. Hoare basado en la técnica
de divide y vencerás, que permite, en promedio,
ordenar n elementos en un tiempo proporcional a n
log n.
1. Elegir un elemento de la lista de
elementos a ordenar, al que
llamaremos pivote.
2. Resituar los demás elementos de la
lista a cada lado del pivote, de
manera que a un lado queden todos
los menores que él, y al otro los
mayores. Los elementos iguales al
pivote pueden ser colocados tanto a
su derecha como a su izquierda,
dependiendo de la implementación
deseada. En este momento, el pivote
ocupa exactamente el lugar que le
corresponderá en la lista ordenada.
3. La lista queda separada en dos
sublistas, una formada por los
elementos a la izquierda del pivote,
y otra por los elementos a su
derecha.
4. Repetir este proceso de forma
recursiva para cada sublista
mientras éstas contengan más de un
elemento. Una vez terminado este
proceso todos los elementos estarán
ordenados.
Como se puede suponer, la eficiencia del algoritmo
depende de la posición en la que termine el pivote
elegido.
En el mejor caso, el pivote termina en el centro de
la lista, dividiéndola en dos sublistas de igual
tamaño. En este caso, el orden de complejidad del
algoritmo es O(n·log n).
En el peor caso, el pivote termina en un extremo de
la lista. El orden de complejidad del algoritmo es
entonces de O(n²). El peor caso dependerá de la
implementación del algoritmo, aunque
habitualmente ocurre en listas que se encuentran
ordenadas, o casi ordenadas. Pero principalmente
depende del pivote, si por ejemplo el algoritmo
3. Universidad Tenica de Machala. DANIEL GUAYCHA.
Utilitarios I 2014
3
implementado toma como pivote siempre el primer
elemento del array, y el array que le pasamos está
ordenado, siempre va a generar a su izquierda un
array vacío, lo que es ineficiente.
PROGRAMA EN C++
main(){
int izq,der,temporal,pivote;
izq=lim_izq;
der=lim_der;
pivote=num[(izq+der)/2];
do{
while(num[izq]<pivote &&
izq<lim_der)izq++;
while(pivote<num[der]&& der>lim_izq)der--;
if(izq<=der){
temporal=num[izq];
num[izq]=num[der];
num[der]=temporal;
izq++;
der--;
}
}while(izq>=der);
if(lim_izq<der){qs(num,lim_izq,der);}
if(lim_der>izq){qs(num,lim_der,izq);}
}
CONCLUSIONES
Los algoritmos de ordenamiento no permiten, como
su nombre mismo lo dice, ordenar. En este caso nos
servirán para ordenar vectores o matrices con
valores asignados
Aleatoriamente. Nosotros nos centráramos en los
métodos mas populares analizando la cantidad De
comparaciones que suceden, el tiempo que demora
y revisando el codigo, escrito En c++
5. REFERENCIAS
[1] Deitel, H. M., Deitel, P. J., & Octavio, G. P. (2004).
Cómo programar en C/C y Java. México: Pearson
Educación.
[2] Weiss, Mark Allen: "Estructuras de datos y
algoritmos", Addison-Wesley Iberoamericana, 1995.
[3] Kernighan, Brian W.; Ritchie, Dennis M.: "El
lenguaje de programación C'', Prentice-Hall
Hispanoamericana, 1991.
[4] JOYANES, L. (2008). Fundamentos de la
programación. Algoritmos y Estructura de Datos, 4ª
Edición. Madrid: McGraw-Hill.