Conviértete en un emprendedor,profesional del conocimiento en la programación

lunes, 9 de enero de 2012

ORDENAMIENTO Y BUSQUEDA EN ARREGLOS SIMPLES

Compartir con:


ORDENAMIENTO Y BUSQUEDA

En arreglos simples

ORDENAMIENTO

Los algoritmos de ordenamiento nos permiten, como su nombre lo dice, ordenar. Ordenar colecciones de datos como vectores, matrices, colecciones de objetos. Nos centraremos en los métodos más populares, analizando la cantidad de comparaciones que suceden, el tiempo que demora y revisando el código, escrito en Java, de cada algoritmo.

MÉTODOS ITERATIVOS

Estos métodos son simples de entender y de programar ya que son iterativos, simples ciclos y sentencias que hacen que el vector pueda ser ordenado. Dentro de los Algoritmos iterativos encontramos:
– Burbuja
– Inserción
– Selección
– Shellsort

METODOS RECURSIVOS

Estos métodos son aún más complejos, requieren de mayor atención y conocimiento para ser entendidos. Son rápidos y efectivos, utilizan generalmente la técnica Divide y vencerás, que consiste en dividir un problema grande en varios pequeños para que sea más fácil resolverlos.
Mediante llamadas recursivas a sí mismos, es posible que el tiempo de ejecución y de ordenación sea más óptimo. Dentro de los algoritmos recursivos encontramos:
– Ordenamiento por Mezclas (merge sort)
– Ordenamiento Rápido (quick sort)
Dentro de cada método, inclusive, existen variantes. Es decir, variaciones que han mejorado el algoritmo original.



BURBUJA

El método de la burbuja es uno de los más simples, es tan fácil como comparar todos los elementos de una lista contra todos, si se cumple que uno es mayor o menor a otro, entonces los intercambia de posición.
Por ejemplo, imaginemos que tenemos el siguiente vector: 5, 6, 1, 0, 3
Lo que haría una burbuja simple, seria comenzar recorriendo los valores de izquierda a derecha, comenzando por el 5. Lo compara con el 6, con el 1, con el 0 y con el 3, si es mayor o menor (dependiendo si el orden es ascendente o descendente) se intercambian de posición. Luego continua con el siguiente, con el 6, y lo compara con todos los elementos de la lista, esperando ver si se cumple o no la misma condición que con el primer elemento. Así, sucesivamente, hasta el último elemento de la lista.

Código java:
                                         int temp;
                                                for(int i = 0; i < limite; i++){
                                                           for(int j = 0; j < limite-1; j++){
                                                                         if(vector[j] > vector[j+1]){
                                                                                  temp = vector[j];
                                                                                  vector[j] = vector[j+1];
                                                                                  vector[j+1] = temp;
                                                                        }
                                                                 }
                                                        }

BURBUJA OPTIMIZADA

El hecho de que los elementos que están detrás del que se está comparando, ya están ordenados, las comparaciones serian aún menos y el método seria aún más efectivo. Si tenemos una lista de 10 elementos y estamos analizando el quinto elemento, qué sentido tiene que el quinto se compare con el primero, el segundo o el tercero, si supuestamente, ya están ordenados Entonces optimizamos más aún el algoritmo, quedando nuestra versión final del algoritmo optimizado de la siguiente manera:

Código java:
                   int temp;
                   for (int i=0 ; i<limite - 1; i++)
                       for (int j=i+1; j<limite; j++)
                           if (vector[i] > vector[j]){
                                temp = vector[i];
                                vector[i] = vector[j];
                                vector[j] = temp;
                        }

Analizar la siguiente Variante:
                                                          boolean hayCambios = true;
                                                           int temp;
                                                           for (int i = 0; hayCambios ; i++) {
                                                                       hayCambios = false;
                                                                             for (int j = 0; j < limite - 1; j++) {
                                                                                 if (vector[j] > vector[j + 1]) {
                                                                                         temp = vector[i];
                                                                                          vector[i] = vector[j];
                                                                                          vector[j] = temp;
                                                                                          hayCambios = true;
                                                                       }
                                                      }
                                         }

INSERCIÓN:

El bucle principal de la ordenación por inserción va examinando sucesivamente todos los elementos del vector desde el segundo hasta el n-ésimo, e inserta cada uno en el lugar adecuado entre sus precedesores dentro del vector.

Código java:

                                int i, temp, j;
                                for (i = 1; i < vector.length; i++){
                                             temp = vector[i];
                                                      j = i - 1;
                                  while ( (vector[j] > temp) && (j >= 0){
                                  vector[j + 1] = vector[j];
                                             j--;
                                    }
                                                    vector[j + 1] = temp;
                               }



SELECCION:

La ordenación por selección funciona seleccionando el menor elemento del vector y llevándolo al principio; a continuación selecciona el siguiente menor y lo pone en la segunda posición del vector y así sucesivamente.

Código java:
                       
                                                          int i, j, k, p, buffer, limit = vector.length-1;
                                                                   for(k = 0; k < limit; k++){
                                                                        p = k;
                                                                   for(i = k+1; i <= limit; i++)
                                                                     if(vector[i] < vector[p]) p = i;
                                                                          if(p != k){
                                                                              buffer = vector[p];
                                                                              vector[p] = vector[k];
                                                                               vector[k] = buffer;
                                                                    }
                                                              }


COMPARACION DE TIEMPOS

Se han ordenado una cantidad determinada de elementos aleatorios en una lista mediante distintos métodos de ordenamiento y se ha registrado el tiempo de ejecución en segundos:

 

 Como podemos analizar, el algoritmo que se va demorando cada vez más tiempo es el de la burbuja, luego de selección y tercero el inserción. Los algoritmos que los siguen son el Shell y el de ordenación por mezcla, pero el más óptimo es el “Rápido” o quick sort.

BUSQUEDA:
Puede aplicar su método de búsqueda secuencial.
                        int busquedaSecuencial( int key ){
                                 for(int i=0, i<n, i++){
                              if(vector[i]==key)
                                    return i;   }
                      return -1;
}

Sin embargo, cuando el vector está ordenado, el método de búsqueda puede mejorar en tiempo, de la siguiente manera:
                            int busquedaSecuencial( int key){
                                         int i = 0;
                                        while(i<n && vector[i]<key){
                                                  i++;
                                         }
                                         if(i<n)
                                                  return i;
                                       else
                                                 return-1;
                                                                    }



También se puede aplicar la búsqueda binaria cuando se tiene un vector ordenado, de la siguiente manera:
                             int busquedaBinaria (int key ){
                                   int inicio = 0 ;
                                   int fin =n-1;
                                   while( inicio <= fin ){
                                        int mitad <-(inicio + fin) / 2;
                                        if( vector[mitad] < key )
                                                  inicio = mitad + 1;
                                     else
                                                if( vector[mitad] > key )
                                                       fin = mitad –1;
                                     else
                                                   return mitad;  }
                 return -1;    
                                    }





0 comentarios:

Publicar un comentario