top of page

ORDENAMIENTO

La ordenación o clasificación de datos consiste en la disposición de los mismos de acuerdo con algún valor o característica. Por ejemplo, cada elemento de una agenda telefónica tiene un campo nombre, un campo dirección y un campo número telefónico. Por lo regular los datos en la agenda se encuentran organizados en un orden de la A la Z. De la misma forma un lista ó vector de datos se dice que esta ordenado de manera ascendente, si X [ i ] <= X [ i +1] y, por otro lado, se dice que esta ordenado de manera descendente sí X [ i ] >= X [ i +1].

 

El proceso de ordenación es uno de los mecanismos más interesantes cuando llega el momentode mostrar que existen múltiples soluciones para un mismo problema, y que cada soluciónalgorítmica tiene sus propias ventajas y desventajas.

 

Una forma de medir la eficiencia de un algoritmo de esta clase, es verificar el número decomparaciones entre valores clave, además del número de movimientos que se tengan que realizar entre elementos (intercambios) de la lista. 

 

 

ORDENAMIENTO DE SELECCIÓN DIRECTA

 

La idea básica es encontrar el elemento más pequeño (grande), en orden ascendente de la lista, e intercambiarlo con el elemento que ocupa la primera posición en la lista, a continuación se busca el  siguiente elemento más pequeño y se transfiere a la segunda posición. Se repite el proceso hasta  que el último elemento ha sido transferido a su posición correcta.

 

El algoritmo de ordenación depende a su vez del algoritmo necesario para localizar el componente mayor (menor) de un array. Es un proceso muy similar al método de la burbuja pero haciendo más eficiente la búsqueda y evitando intercambios innecesarios. 

 

DIAGRAMA DE FLUJO DE ORDENAMIENTO Y su PROCEDIMIENTO : 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ORDENAMIENTO POR BURBUJA

 

Es uno de los métodos relativamente más sencillo e intuitivo, pero también resulta ser muy ineficiente. Se basa en la ordenación por cambio, y recibe su nombre de la semejanza con las burbujas de un depósito de agua donde cada burbuja busca su propio nivel. 

 

Los pasos a efectuar en el caso de una ordenación ascendente (en el caso de la ordenación 

descenderte solo habría que cambiar el signo de comparación) son: 

 

1. Comparar el primer y segundo elemento, intercambiarlos si el primero es mayor que el segundo; luego se compara el primero con el tercero, intercambiándose en caso necesario, y el 

proceso se repite hasta llegar al último elemento. De este modo, tras la primera iteración la casilla primera conservara el elemento más pequeño de esa iteración..

 

2. Se repite el paso anterior, pero ahora con el segundo y tercero, en caso de ser necesario se 

intercambian, y así hasta llegar a comparar el segundo con el ultimo. 

 

Consideremos el siguiente ejemplo. Se cuenta con un vector de 6 posiciones donde se inicia una lista de números { 7, 2, 8, 3, 5, 1 }, la cual será ordenada en forma ascendente { 1, 2, 3, 5, 7, 8 }, observe como se declara una variable constante entera llamada n la cual tiene un valor de 6, enseguida se declara un vector de tipo entero que contendrá una cantidad n de casillas, en este caso 6, declaramos también las variables i y j que nos ayudaran a desplazarnos entre casilla y casilla para hacer las comparaciones. Y finalmente la variable tem,almacenara temporalmente el valor a intercambiar entre las casillas que lo necesiten. 

 

DIAGRAMA DE FLUJO DE ORDENAMIENTO Y su PROCEDIMIENTO : 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ORDENAMIENTO POR INSERCIÓN

 

Este método también se denomina “método del jugador de cartas”, por la semejanza con la formade clasificar las cartas de una baraja, insertando cada carta en el lugar adecuado. 

 

El algoritmo ordena los dos primeros elementos de la lista, a continuación el tercer elemento se inserta en la posición que corresponda, el cuarto se inserta en la lista de tres elementos, y así 

sucesivamente. Este proceso continua hasta que la lista este totalmente ordenada. 

 

Sea una lista A[1], A[2], ... A[n]. Los pasos a dar para una ordenación ascendente son: 

1. Ordenar A[1] y A[2]. 

2. Comparar A[3] con A[2], si A[3] es mayor o igual a que A[2], sigue con el siguiente elemento si no se compara A[3] con A[1]; si A[3] es mayor o igual que A[1], insertar A[3] entre A[1] yA[2]. 

Si A[3] es menor que A[1], entonces transferir A[3] a A[1], A[1] a A[2] y A[2] a A[3]. 

3. Se suponen ordenados los n-1 primeros elementos y corresponde insertar el n-ésimo elemento. Si A[m] es mayor que A[k] (con K = 1, 2, ..., m-1), se debe correr una posición A[k+1], ... A[m-1] y almacenar A[m] en la posición k+1. 

 

DIAGRAMA DE FLUJO DE ORDENAMIENTO Y  SU PROCEDIMIENTO : 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include<iostream.h>

#include<conio.h>

void main()

{clrscr();

int i,j,a[30], aux,menor,n;

cout<<"ingrese el tamaño del vetor: ";

cin>>n;

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

{  cout<<"vetor["<<(i)<<"]:";

cin>>a[i];

}

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

{ menor=i;

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

{ if (a[j]<a[menor])

{

menor=j;

}

}

aux =a[i];

a[i]=a[menor];

a[menor]=aux;

}

 cout<<"el orden es:"<<endl;

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

{

 cout<< a[i];

}

 getch();

}

#include<iostream.h>
#include<conio.h>
void main()
{int j,i,n,aux,v[50],k=1,p,x;
cout<<"ingrese numero de vectores:";
cin>>n;
for(i=1;i<=n;i++)
{cout<<"ingrse vector["<<(i)<<"]:";
cin>>v[i];
}
{for(p=1;p<3;p++)

for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-1;j++)
if(v[j]>v[j+1])
{aux=v[j];
v[j]=v[j+1];
v[j+1]=aux;
}}
cout<<"el numero ordenado es:\n";
for(i=1;i<=n;i++)
{cout<<v[i];
}
if(p==1){
cout<<"\ningrese vector a ordenar:";
cin>>x;
n=n+1;
v[n]=x;}
cout<<"el numero ordenado es:\n";
for(i=1;i<=n;i++)
{cout<<v[i];
}
getch();
}}

#include<iostream.h>

#include<conio.h>

void main()

{clrscr();

int i,j,v[30], aux,n;

cout<<"ingrese el tamaño del vector: ";

cin>>n;

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

{cout<<"vetor["<<(i)<<"]:";

cin>>v[i];

}

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

{for(j=i;j>0;j--)

{if(v[j+1]<v[j])

{aux=v[j+1];

v[j+1]=v[j];

v[j]=aux;

}

}

}

cout<<"los numeros ordenados son:"<<endl;

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

{cout<<"vetor["<<(i)<<"]: "<<v[i]<<endl;

}

getch();

}

#include<iostream.h>

#include<conio.h>

void quicksort (int v [],int izquierda ,int derecha ) {

int i=izquierda,j=derecha ;

int tmp ;

int pivote=v[(izquierda+derecha)/ 2];

while(i<=j) {

for(i=izquierda;v[i]<pivote;i++);

for(j=derecha;v[j]>pivote;j--);

if(i<=j) {

tmp = v[i];

v[i]=v[j];

v[j]=tmp ;

i++;

j--;

}

}

if (izquierda<j){

quicksort (v,izquierda,j);}

if (i<derecha){

quicksort(v,i,derecha);}

}

void main()

{

int v[50],n;

clrscr();

cout<<"cuantos elementos desea ingresar: ";

cin>>n;

for (int i=0;i<n; i++)

{

cout<<"v["<<i+1<<"]= ";

cin>>v[i];

}

quicksort (v, 0, n-1);

cout<<"numeros ordenados son"<<endl;

for (i=0; i<n; i++){

cout<<"v["<<i+1<<"]= "<<v[i]<<endl;}

getch();

}

ORDENAMIENTO POR QUICKSORT

 

Es un algoritmo relativamente eficiente y representa una mejora sustancial al método de intercambio directo.

 

El algoritmo es el siguiente:

 

1. Elegir un elemento de la lista de elementos a ordenar (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 sub-listas, 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 sub-lista mientraséstas contengan más de un elemento. Una vez terminado este procesotodos 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 dela 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,  por  ejemplo  el  algoritmo  implementado  toma  como  pivote siempre el primer elemento del arreglo, y el arreglo que le pasamos está ordenado, siempre va a generar a su izquierda un arreglo vacío, lo que es ineficiente.

 

 

 

DIAGRAMA DE FLUJO DE ORDENAMIENTO Y SU PROCEDIMIENTO:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ejercicios :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

bottom of page