You are on page 1of 5

MTODOS DE ORDENAMIENTO.

Uno de los procedimientos ms comunes y tiles en el procesamiento de datos, es la


clasificacin u ordenacin de los mismos. Se considera ordenar al proceso de reorganizar
un conjunto dado de objetos en una secuencia determinada. Cuando se analiza un
mtodo de ordenacin, hay que determinar cuntas comparaciones e intercambios se
realizan para el caso ms favorable, para el caso medio y para el caso ms desfavorable.
La colocacin en orden de una lista de valores se llama Ordenacin. Por ejemplo, se
podra disponer una lista de valores numricos en orden ascendente o descendente, o
bien una lista de nombres en orden alfabtico. La localizacin de un elemento de una lista
se llama bsqueda.
Debido a que las estructuras de datos son utilizadas para almacenar informacin, para
poder recuperar esa informacin de manera eficiente es deseable que aquella est
ordenada. Existen varios mtodos para ordenar las diferentes estructuras de datos
bsicas.
En general los mtodos de ordenamiento no son utilizados con frecuencia, en algunos
casos slo una vez. Hay mtodos muy simples de implementar que son tiles en los casos
en dnde el nmero de elementos a ordenar no es muy grande (ej, menos de 500
elementos). Por otro lado hay mtodos sofisticados, ms difciles de implementar pero
que son ms eficientes en cuestin de tiempo de ejecucin.
Tipos de ordenamientos:
Los 2 tipos de ordenamientos que se pueden realizar son: los internos y los externos.
Los internos:
Son aquellos en los que los valores a ordenar estn en memoria principal, por lo que se
asume que el tiempo que se requiere para acceder cualquier elemento sea el mismo
(a[1], a[500], etc).
Los externos:
Son aquellos en los que los valores a ordenar estn en memoria secundaria (disco, cinta,
cilindro magntico, etc), por lo que se asume que el tiempo que se requiere para acceder
a cualquier elemento depende de la ltima posicin accesada (posicin 1, posicin 500,
etc).
Eficiencia en tiempo de ejecucin:
Una medida de eficiencia es:
Contar el # de comparaciones (C)
Contar el # de movimientos de items (M)
Estos estn en funcin de el #(n) de items a ser ordenados.
Un "buen algoritmo" de ordenamiento requiere de un orden nlogn comparaciones.
La eficiencia de los algoritmos se mide por el nmero de comparaciones e intercambios
que tienen que hacer, es decir, se toma n como el nmero de elementos que tiene el
arreglo o vector a ordenar y se dice que un algoritmo realiza O(n2) comparaciones cuando
compara n veces los n elementos, n x n = n2


ORDENAMIENTO DE BURBUJA
La Ordenacin de burbuja (Bubble Sort en ingls) 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". Tambin es conocido como el mtodo del intercambio directo. Dado que
solo usa comparaciones para operar elementos, se lo considera un algoritmo de
comparacin, siendo el ms sencillo de implementar.
EJEMPLO BURBUJA
#include<stdio.h>
#include<conio.h>
void main()
{
int a[3]={3,2,1};
int i,j,aux,n=3;
clrscr();
for(i=0;i<=n;i++)
{
for(j=0;j<n-1;j++){
if(a[j]>a[j+1]){
aux=a[j];
a[j]=a[j+1];
a[j+1]=aux;
}
}
}
for(i=0;i<3;i++)
{
printf("%d",a[i]);
}
getch();
}


Ventajas del mtodo de ordenacin por burbuja:
Es bastante sencillo
En un cdigo reducido se realiza el ordenamiento
Eficaz
Desventajas del mtodo de ordenacin por burbuja:
Consume bastante tiempo de computadora
Requiere muchas lecturas/escrituras en memoria
Mtodo de ordenamiento Quick Sort
El mtodo de ordenamiento Quick Sort es actualmente el ms eficiente y veloz de los mtodos de
ordenacin interna. Es tambin conocido con el nombre del mtodo rpido y de ordenamiento
por particin, en el mundo de habla hispana.
Este mtodo es una mejora sustancial del mtodo de intercambio directo y recibe el nombre de
Quick Sort por la velocidad con que ordena los elementos del arreglo. Su autor C.A. Hoare lo
bautiz as.
La idea central de este algoritmo consiste en lo siguiente:
Se toma un elemento x de una posicin cualquiera del arreglo.
Se trata de ubicar a x en la posicin correcta del arreglo, de tal forma que todos los elementos
que se encuentran a su izquierda sean menores o iguales a x y todos los elementos que se
encuentren a su derecha sean mayores o iguales a x.
Se repiten los pasos anteriores pero ahora para los conjuntos de datos que se encuentran a la
izquierda y a la derecha de la posicin correcta de x en el arreglo.
Por quin fue creada?
Esta es probablemente la tcnica ms rpida conocida. Fue desarrollada por C.A.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:
Eliges un elemento de la lista. Puede ser cualquiera (en Optimizando veremos una forma
ms efectiva). Lo llamaremos elemento de divisin.
Buscas la posicin que le corresponde en la lista ordenada (explicado ms abajo).
Acomodas los elementos de la lista a cada lado del elemento de divisin, de manera que a
un lado queden todos los menores que l y al otro los mayores (explicado ms abajo
tambin). En este momento el elemento de divisin separa la lista en dos sublistas (de ah
su nombre).
Realizas esto de forma recursiva para cada sublista mientras stas tengan un largo mayor
que 1. Una vez terminado este proceso todos los elementos estarn ordenados.
Una idea preliminar para ubicar el elemento de divisin en su posicin final sera contar la
cantidad de elementos menores y colocarlo un lugar ms arriba. Pero luego habra que mover
todos estos elementos a la izquierda del elemento, para que se cumpla la condicin y pueda
aplicarse la recursividad. Reflexionando un poco ms se obtiene un procedimiento mucho ms
efectivo. Se utilizan dos ndices: i, al que llamaremos contador por la izquierda, y j, al que
llamaremos contador por la derecha. El algoritmo es ste:
Recorres la lista simultneamente con i y j: por la izquierda con i (desde el primer
elemento), y por la derecha con j (desde el ltimo elemento).
Cuando lista[i] sea mayor que el elemento de divisin y lista[j] sea menor los
intercambias.
Repites esto hasta que se crucen los ndices.
El punto en que se cruzan los ndices es la posicin adecuada para colocar el elemento de
divisin, porque sabemos que a un lado los elementos son todos menores y al otro son
todos mayores (o habran sido intercambiados).
Al finalizar este procedimiento el elemento de divisin queda en una posicin en que todos los
elementos a su izquierda son menores que l, y los que estn a su derecha son mayores.



Ejemplo
int pivote=A[izq]; // tomamos primer elemento como pivote
int i=izq; // i realiza la bsqueda de izquierda a derecha
int j=der; // j realiza la bsqueda de derecha a izquierda
int aux;

while(i<j){ // mientras no se crucen las bsquedas
while(A[i]<=pivote && i<j) i++; // busca elemento mayor que pivote
while(A[j]>pivote) j--; // busca elemento menor que pivote
if (i<j) { // si no se han cruzado
aux= A[i]; // los intercambia
A[i]=A[j];
A[j]=aux;
}
}
A[izq]=A[j]; // se coloca el pivote en su lugar de forma que tendremos
A[j]=pivote; // los menores a su izquierda y los mayores a su derecha
if(izq<j-1)
quicksort(A,izq,j-1); // ordenamos subarray izquierdo
if(j+1 <der)
quicksort(A,j+1,der); // ordenamos subarray derecho
Mtodo de Bsqueda Secuencial:
Este mtodo se usa para buscar un elemento de un vector, es explorar secuencialmente el vector,
es decir; recorrer el vector desde el prior elemento hasta el ltimo. Si se encuentra el elemento
buscado se debe visualizar un mensaje similar a Fin de Bsqueda o Elemento encontrado y
otro que diga posicin= en caso contrario, visualizar un mensaje similar a Elemento no existe
en la Lista.
Este tipo de bsqueda compara cada elemento del vector con el valor a encontrar hasta que este
se consiga o se termine de leer el vector completo.
Ejemplo
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define TAM 10
void main(){
int a[TAM], temp, i, j, num;
clrscr();
randomize(); //Inicializa el generador de numeros aleatorios
printf ("Llenando arreglo con nmeros aleatorios\n");
for (i=0; i< TAM; i++)
a[i]=random(100);
printf ("Numero a buscar? ");
scanf ("%d", &num);
for (i=0; i< TAM; i++)
if (a[i] == num){
printf ("\nValor encontrado");
printf ("\nPosicion: %d", i);
} else
printf ("\nNo existe");
printf ("El arreglo era:\n");
for (i=0; i< TAM; i++)
printf ("%d ", a[i]);
getch();
}

You might also like