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(); }