Sunteți pe pagina 1din 15

Mtodos de ordenamiento

Alumno:Jess Alberto Luna Gmez


Maestro:
Fecha: 07/12/16
Introduccin

El ordenamiento es la operacin de arreglar un grupo de registros, en algn orden secuencial de


acuerdo a un criterio de ordenamiento. El ordenamiento se efecta con base en el valor de algn campo
en un registro. El objetivo principal de un ordenamiento es el facilitar las bsquedas de los miembros
del conjunto ordenado.

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una
secuencia que represente un orden, el cual puede ser numrico, alfabtico o incluso alfanumrico,
ascendente o descendente.

A lo largo de este documento se analizaran algoritmos de ordenamiento que ponen elementos en


una lista o un vector en una secuencia dada por una relacin de orden, es decir, el resultado de salida ha
de ser una permutacin(bsicamente una tupla sin que los nmeros se repitan).

Desde el comienzo de la computacin, el problema del ordenamiento ha trado gran cantidad de


investigacin, esto es por la gran complejidad de resolverlo eficientemente a pesar de tener un
planteamiento simple y familiar, actualmente existen distintos y variados mtodos de ordenamiento
muchos consideran el problema resuelto, pero tiles algoritmos de ordenamiento se siguen inventando
hasta el da de hoy.
Mtodos de ordenamiento elementales:

Tipos de ordenamiento:
Ordenamiento interno->Ordenamiento de datos en memoria principal.(La lectura y grabacin se hacen
en registros.
Ordenamiento externo-> Ordenamiento de datos en disco.
Tipos de entrada de Datos:
Entrada ordenada->Mejor caso.
Entrada orden inverso->peor caso.
Entrada desordenada->caso al azar.
Tipos de algoritmo:
Algoritmo sensible->Modifica su tiempo de ejecucin segn el tipo de entrada.
Algoritmo no sensible:Su tiempo de ejecucin es independiente al tipo de entrada.
Algoritmo estable-> Aquellos que teniendo clave repetida, mantiene su posicin inicial a la final.
Algoritmo no estable-> Aquello que no respetan la posicin inicial que la final teniendo claves
repetidas.

1.-Ordenamiento de burbuja

La ordenacin de burbuja es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento


de la lista que va a ser ordenada con el siguiente, intercambindolos de posicin si estn en el orden
equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten ms intercambios,
lo cual significa que la lista est ordenada. Este algoritmo obtiene su nombre de la forma con la que
suben por la lista los elementos durante los intercambios, como si fueran pequeas burbujas, es de los
ms sencillos de implementar.

La idea bsica del ordenamiento de la burbuja es recorrer el conjunto de elementos en forma


secuencial varias veces, cada paso compara un elemento del conjunto con su sucesor(x[i] con x[i+1]), e
intercambia los dos elementos si no estan en el orden adecuado.

Vamos a ver un ejemplo del algoritmo ya implementado, esta es nuestra lista:


4-3-5-2-1
Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos comparando el primero con el
segundo elemento. 4 es mayor que 3, as que intercambiamos. Ahora tenemos:
3-4-5-2-1
Ahora comparamos el segundo con el tercero: 4 es menor que 5, as que no hacemos nada.
Continuamos con el tercero y el cuarto: 5 es mayor que 2. Intercambiamos y obtenemos:
3-4-2-5-1
Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos nuevamente:
3-4-2-1-5
Repitiendo este proceso vamos obteniendo los siguientes resultados:
3-2-1-4-5
2-1-3-4-5
1-2-3-4-5
Diagrama de flujo:
Este es un ejemplo de un programa que captura nmeros y los ordena de menor a mayor en lenguaje
C++, compilado con g++ 5.4.0:
#include<iostream>

using namespace std;

int main() {

int num, aux;


int comparaciones = 0;
int intercambios = 0;
int* arreglo;
cout << "Cuantos numeros seran: ";
cin >> num;
arreglo = new int[num];
cout << endl << "***CAPTURA DE NUMEROS***" << endl;

for(int x = 0; x < num; x++) {


cout << "Ingresa el numero " << x << " de la serie: ";
cin >> arreglo[x];
cout << endl;
}
cout << "***MUESTRA DE NUMEROS***" << endl;

for(int y = 0; y < num; y++) {


cout << "Numero " << y << ".- " << arreglo[y] << endl;
}

for(int z = 1; z < num; ++z) {


for(int v = 0; v < (num - z); ++v) {
comparaciones++;
if(arreglo[v] > arreglo[v + 1]) {
aux = arreglo[v];
arreglo[v] = arreglo[v + 1];
arreglo[v + 1] = aux;
intercambios++;
}
}
}

cout << "***NUMEROS ARREGLADOS***" << endl;

for(int w = 0; w < num; w++) {


cout << "Numero " << w << ".- " << arreglo[w] << endl;
}

cout << "Numero de comparaciones: " << comparaciones << endl;


cout << "Numero de intercambios: " << intercambios << endl;

delete[] arreglo;
return 0;
}
Ventajas:

Fcil implementacin.
No requiere memoria adicional.

Desventajas:
Muy lento.
Realiza numerosas comparaciones.
Realiza numerosos intercambios.

2.-Ordenamiento por seleccin

Este algoritmo tambin es sencillo, consiste en lo siguiente:


-Buscas el elemento ms pequeo de ella lista.
-Lo intercambias con el elemento ubicado en la primera posicin de la lista.
-Buscas el segundo elemento ms pequeo de la lista.
-Lo intercambias con el elemento que ocupa la segunda posicin en la lista.
-Repites este proceso hasta que hayas ordenado toda la lista.

Este mtodo de ordenamiento mejora ligeramente el algoritmo de la burbuja. En el caso de tener que
ordenar un vector de enteros, esta mejora no es muy sustancial, pero cuando hay que ordenar un vector
de estructuras ms complejas.

Ejemplo del algoritmo ya implementado:


Vamos a ordenar la siguiente lista:
4-3-5-2-1
Comenzamos buscando el elemento menor entre la primera y ltima posicin. Es el 1. Lo
intercambiamos con el 4 y la lista queda as:
1-3-5-2-4
Ahora buscamos el menor elemento entre la segunda y la ltima posicin. Es el 2. Lo intercambiamos
con el elemento en la segunda posicin, es decir el 3. La lista queda as:
1-2-5-3-4
Buscamos el menor elemento entre la tercera posicin y la ltima. Es el 3, que intercambiamos con el
5:
1-2-3-5-4
El menor elemento entre la cuarta y quinta posicin es el 4, que intercambiamos con el 5:
1-2-3-4-5
De esta manera se puede escribir el siguiente pseudocdigo para ordenar una lista de n elementos
indexados desde el 1:
para i=0 hasta n-1
mnimo = i;
para j=i+1 hasta n
si lista[j] < lista[mnimo] entonces
mnimo = j /* (!) */
fin si
fin para
intercambiar(lista[i], lista[mnimo])
fin para

Este algoritmo realiza muchas menos operaciones intercambiar() que el de la burbuja, por lo que lo mejora en algo. Si la
lnea comentada con (!) se sustituyera por intercambiar(lista[i], lista[j]) tendramos una versin del algoritmo de la burbuja
(naturalmente eliminando el orden intercambiar del final).
Ejemplo en c++

#include<iostream>

using namespace std;

#include"leearreglo.h"

#define largo 50

void seleccionsort (int A[], int n)

int min,i,j,aux;

for (i=0; i<n-1; i++)

min=i;

for(j=i+1; j<n; j++)

if(A[min] > A[j])

min=j;

aux=A[min];

A[min]=A[i];

A[i]=aux ;

void main ()

int A[largo],n;

do{

cout<<"Cantidad de numeros a ingresar: ";cin>>n;


if(n<=0||n>largo)

cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl;

}while(n<=0||n>largo);

leeCadena(n,A);

seleccionsort(A,n);

muestraCadena(n,A);

ANLISIS DEL ALGORITMO.


Requerimientos de Memoria: Al igual que el ordenamiento burbuja, este algoritmo slo necesita una
variable adicional para realizar los intercambios.
Tiempo de Ejecucin: El ciclo externo se ejecuta n veces para una lista de n elementos. Cada bsqueda
requiere comparar todos los elementos no clasificados.

Ventajas:
1. Fcil implementacin.
2. No requiere memoria adicional.
3. Rendimiento constante: poca diferencia entre el peor y el mejor caso.

Desventajas:
1. Lento.
2. Realiza numerosas comparaciones.

3 ORDENAMIENTO POR INSERCIN DIRECTA

DESCRIPCIN.
El algoritmo de ordenacin por el mtodo de insercin directa es un algoritmo relativamente sencillo y
se comporta razonablemente bien en gran cantidad de situaciones.
Completa la tripleta de los algoritmos de ordenacin ms bsicos y de orden de complejidad cuadrtico,
junto con SelectionSort y BubbleSort.
Se basa en intentar construir una lista ordenada en el interior del array a ordenar.
De estos tres algoritmos es el que mejor resultado da a efectos prcticos. Realiza una cantidad de
comparaciones bastante equilibrada con respecto a los intercambios, y tiene un par de caractersticas
que lo hacen aventajar a los otros dos en la mayor parte de las situaciones.
Este algoritmo se basa en hacer comparaciones, as que para que realice su trabajo de ordenacin son
imprescindibles dos cosas: un array o estructura similar de elementos comparables y un criterio claro
de comparacin, tal que dados dos elementos nos diga si estn en orden o no.
En cada iteracin del ciclo externo los elementos 0 a i forman una lista ordenada.
ANLISIS DEL ALGORITMO.
Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable.
Requerimientos de Memoria: Una variable adicional para realizar los intercambios.
Tiempo de Ejecucin: Para una lista de n elementos el ciclo externo se ejecuta n1 veces. El ciclo
interno se ejecuta como mximo una vez en la primera iteracin, 2 veces en la segunda, 3 veces en la
tercera, etc.

La principal ventaja de este tipo de ordenamiento es su simplicidad. Tambin exhibe un buen


rendimiento cuando se trabaja con una pequea lista. El ordenamiento por insercin es un algoritmo de
ordenamiento en el lugar, de modo que requiere de espacio mnimo. Su desventaja es que no funciona
tan bien como otros algoritmos mejores de ordenamiento. Con n al cuadrado pasos requeridos para
cada n elemento a ser ordenado, este algoritmo no funciona bien con una lista grande. Por lo tanto, este
slo es til cuando se ordena una lista de pocos elementos.
Ordenamiento Rpido (Quicksort)
El ordenamiento rpido (quicksort en ingls) es un algoritmo basado en la tcnica de divide y vencers,
que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n. Esta es la tcnica
de ordenamiento ms rpida conocida. Fue desarrollada por C. Antony R. Hoare en 1960. El algoritmo
original es recursivo, pero se utilizan versiones iterativas para mejorar su rendimiento (los algoritmos
recursivos son en general ms lentos que los iterativos, y consumen ms recursos).
El algoritmo fundamental es el siguiente:
Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
Resituar los dems 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. En este momento, el pivote ocupa exactamente
el lugar que le corresponder en la lista ordenada.
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.
Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un
elemento. Una vez terminado este proceso todos los elementos estarn ordenados. Como se
puede suponer, la eficiencia del algoritmo depende de la posicin en la que termine el pivote
elegido.
En el mejor caso, el pivote termina en el centro de la lista, dividindola en dos sublistas de igual
tamao. En este caso, el orden de complejidad del algoritmo es O(nlog n).
En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del
algoritmo es entonces de 0(n). El peor caso depender de la implementacin del algoritmo,
aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas.
En el caso promedio, el orden es O(nlog n).

Algoritmo (Orientado a C)

void ordena( int vect[], int izq, int der ){


int i = 0, j = 0;
int x = 0, aux = 0;
i = izq;
j = der;
x = vect [ (izq + der) /2 ];
do{
while( (vect[i] < x) && (j <= der) ){
i++;}
while( (x < vect[j]) && (j > izq) ){
j--;}
if( i <= j ){
aux = vect[i];
vect[i] = vect[j];
vect[j] = aux;
i++; j--;
}
}while( i <= j );
if( izq < j )
ordena( vect, izq, j );
if( i < der )
ordena( vect, i, der );
}
ORDENAMIENTO POR EL MTODO DE SHELL

DESCRIPCIN
El mtodo Shell es una versin mejorada del mtodo de insercin
directa. Este mtodo tambin se conoce con el nombre de insercin con
incrementos crecientes. En el mtodo de ordenacin por insercin
directa cada elemento se compara para su ubicacin correcta en el
arreglo, con los elementos que se encuentran en la parte izquierda del
mismo. Si el elemento a insertar es ms pequeo que el grupo de
elementos que se encuentran a su izquierda, es necesario efectuar
entonces varias comparaciones antes de su ubicacin.
Shell propone que las comparaciones entre elementos se efecten
con saltos de mayor tamao pero con incrementos decrecientes, as, los
elementos quedarn ordenados en el arreglo ms rpidamente.
El Shell sort es una generalizacin del ordenamiento por insercin,
teniendo en cuenta dos observaciones:
1. El ordenamiento por insercin es eficiente si la entrada est "casi
ordenada".
2. El ordenamiento por insercin es ineficiente, en general, porque
mueve los valores slo una posicin cada vez.
El algoritmo Shell sort mejora el ordenamiento por insercin
comparando elementos separados por un espacio de varias posiciones.
Esto permite que un elemento haga "pasos ms grandes" hacia su
posicin esperada. Los pasos mltiples sobre los datos se hacen con
tamaos de espacio cada vez ms pequeos. El ltimo paso del Shell
sort es un simple ordenamiento por insercin, pero para entonces, ya
est garantizado que los datos del vector estn casi ordenados
Bibliografa
https://es.wikipedia.org/wiki/Algoritmo_de_ordenamiento
www.unlam.edu.ar/descargas/1_Metodos.doc
http://c.conclase.net/orden/?cap=burbuja
http://c.conclase.net/orden/?cap=seleccion
https://es.wikipedia.org/wiki/Ordenamiento_por_selecci%C3%B3n
https://techlandia.com/ventajas-desventajas-algoritmos-ordenamiento-info_181515/
http://mis-algoritmos.com/ordenamiento-rapido-quicksort
https://www.slideshare.net/angelamontilla1/metodos-de-ordenamiento-2

S-ar putea să vă placă și