Está en la página 1de 7

METODOS DE ORDENAMIENTO El ordenamiento de los datos implica una importante mejora de la eficiencia en la búsqueda de los mismos.

Existen dos técnicas básicas de ordenamiento: ordenamientos internos y ordenamientos externos. Los métodos de ordenamiento interno se aplican cuando el conjunto de datos a clasificar es lo suficientemente pequeño, de tal forma que pueda caber en memoria principal. El tiempo requerido para leer o escribir registros no se considera significativo para la evaluación del rendimiento interno. Los métodos de ordenamiento externo se aplican a grandes volúmenes de datos, que residen parcial o totalmente en dispositivos de almacenamiento secundario, tales como los discos. Aquí, el tiempo de acceso de lectura y escritura influye en la determinación de la eficiencia del ordenamiento. METODO DE ORDENAMIENTO BURBUJA La idea básica de este método de ordenamiento es la de comparar pares de valores de llaves e intercambiarlos si no están en sus posiciones relativas correctas.

Como los métodos de selección e inserción vistos anteriormente, el método de burbuja requiere O(n^2) comparaciones. No obstante, el método de la burbuja es frecuentemente usado. La idea de este método es la de permitir que cada llave flote a su posición adecuada a través de una serie de pares de comparaciones e intercambios con los valores adyacentes. Cada paso haces que una llave suba a su posición final, como una burbuja, en la lista ordenada. Consideremos otra vez nuestro ejemplo de lista de llaves no ordenadas:

Cada llave se compara con la llave que está encima de ella (en nuestro caso al lado derecho de ella) y se intercambia, si la llave de arriba es más pequeña. Cuando una llave mayor que la llave sujeto se encuentra, la llave sujeto queda encima, y el proceso continúa. Después de la pasada, todas las llaves arriba de la última por intercambiar deberán estar en su posición final. No necesitarán examinarse en pasos posteriores.

int posicion. sin embargo.posicion<ultimo. Una implementación del método de ordenamiento por burbuja puede ser el siguiente: void Burbuja(Lista Numeros. Numeros[posicion]=Numeros[posicion+1]. en el cual las llaves más pequeñas bajan al fondo de la lista. while(ultimo>=1) { for(posicion=0.La actividad del primer paso sube a 14. int auxiliar. es muy conocido (tal vez debido a su nombre) y desafortunadamente muy utilizado (puede ser debido a su relativa facilidad de implementación). Numeros[posicion+1]=auxiliar. Su comportamiento es un poco parecido al método de intercambio selectivo. . pasando el elemento que flota hasta el final a la lista de ordenados. Este método de ordenamiento también puede funcionar con 2 listas. }. una de llaves desordenadas y otra de llaves ordenadas. El método de la burbuja en realidad es muy poco recomendado. a 22 y a 25.posicion++) { if(Numeros[posicion]>Numeros[posicion+1]) { auxiliar=Numeros[posicion]. }. pero para minimizar el espacio utilizado. trabajaremos con una sola lista. int Largo) { int ultimo=Largo-1.

ultimo--. Se divide la lista en dos partes. Hoare (1962). La idea básica del método Quicksort es la siguiente: 1. 2. El proceso descrito es esencialmente recursivo. se le atribuye su creación a C.6 .14 . que es seleccionar una llave del extremo. }. Veamos ahora un ejemplo práctico de cómo funciona este método de ordenamiento: consideremos la siguiente lista de elementos: 7 . Si trabajamos con L1. entonces nuestra lista se divide en dos partes. Esta llave se puede escoger aleatoriamente o haciendo la media de un pequeño conjunto de llaves tomados de la lista. No obstante. METODO DE ORDENAMIENTO QUICKSORT Considerado uno de los mejores métodos de ordenamiento.4 .10 .1 Supongamos que el elemento que se seleccionó al azar fue el 8.A. entonces nuestra lista se divide en dos partes. Se selecciona una llave en particular de la lista. una con los mayores y una con los menores que el 4. incluso en el peor de los casos Quicksort funciona correctamente. R. Así sucesivamente hasta que se llega a una lista con dos elementos. }.9 . Esto se hace para evitar el peor caso de Quicksort. . una con los mayores y una con los menores que el 8. los cuales se comparan y se retornan en orden. El valor óptimo sería aquél que esté precisamente en medio del rango de valores.8 . 3. Se repiten los puntos 1 y 2 para cada parte restante hasta que la lista esté ordenada.3 . una con todos los elementos menores o iguales que la llave seleccionada y otra con todos los elementos mayores o iguales.5 . supongamos que seleccionamos el elemento 4 al azar.

ambas listas estarán ordenadas (tanto la que tenía los mayores como la que tenía los menores que la llave seleccionada) y la lista completa estará ordenada.Lo mismo sucede con la L2 del comienzo (L2: 9 . recordemos que los métodos lineales requieren todos de O(n^2) comparaciones.14). hasta que se obtienen la lista con dos elementos los cuales se ordenan y se retornan. mitad=Numeros[(izq+der)/2]. De hecho. Este es el mejor desempeño encontrado hasta aquí en una técnica de ordenamiento.10 . int inf. Análisis de Rendimiento: El primer paso se ve de la siguiente forma: El segundo paso: Procesar la sublista 1 requiere aproximadamente comparaciones. der=sup. . lo mismo que para procesar la lista 2. En promedio se requieren superpasos para clasificar la lista completa. Al finalizar. Una implementación de este método de ordenamiento puede ser la siguiente: void qs(Lista Numeros. int sup) { int izq=inf. Luego el método de Quicksort requiere de un promedio de comparaciones. mitad. do{ while((Numeros[izq]<mitad)&&(izq<sup))izq++. x. Numeros[izq]=Numeros[der]. while((mitad<Numeros[der])&&(der>inf))der--. el proceso de cada superpaso requiere O(n) comparaciones. if(izq<=der) { x=Numeros[izq].

int n) { qs(Numeros. }. El ordenamiento por inserción es eficiente si la entrada está "casi ordenada". El ordenamiento por inserción es ineficiente. . El método se denomina Shell en honor de su inventorDonald Shell. if(inf<der) qs(Numeros. 2. pues puede darse el caso que el elemento medio sea exactamente un valor extremo de la lista. pero para entonces. en general. esta implementación funciona bastante bien.n-1). teniendo en cuenta dos observaciones: 1. porque mueve los valores sólo una posición cada vez. if(izq<sup) qs(Numeros. Lamentablemente. void QuickSort(Lista Numeros. El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones. ya que como se dijo anteriormente se trata de un número al azar. El Shell sort es una generalización del ordenamiento por inserción. }. A pesar de todo. METODO DE ORDENAMIENTO SHELL El ordenamiento Shell (Shell sort en inglés) es un algoritmo de ordenamiento. Esto permite que un elemento haga "pasos más grandes" hacia su posición esperada. requiere O(n2) comparaciones e intercambios en el peor caso. }while(izq<=der). El último paso del Shell sort es un simple ordenamiento por inserción. izq++.0. este algoritmo selecciona el elemento medio de la lista de claves.der).izq. der--.inf. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños.Numeros[der]=x. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el óptimo O(n log n). pero eso es un punto fácil de solucionar. éste no considera el peor caso.sup). Por ejemplo. Un cambio menor presentado en el libro de V. Pratt produce una implementación con un rendimiento de O(n log2 n) en el peor caso. }. Cómo podrá apreciarse. considere una lista de números como [13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10]. Aunque es fácil desarrollar un sentido intuitivo de cómo funciona este algoritmo. es muy difícil analizar su tiempo de ejecución. Su implementación original. ya está garantizado que los datos del vector están casi ordenados. Si comenzamos con un tamaño de paso de 5.

int j. i < Entrada. 123. } . } vec[j] = tmp. Aquí. i++) { int tmp = vec[i].out.p].length. p > 0. 1. 21. for(j = i.podríamos visualizar esto dividiendo la lista de números en una tabla con 5 columnas. 5. 6. j -= p ) { vec[j] = vec[j . Esta lista es entonces de nuevo ordenada usando un ordenamiento con un espacio de 3 posiciones. p = p == 2 ? 1 : (int) ( p / 2. El Shell sort lleva este nombre en honor a su inventor.2 ) ) { for( int i = p." [1] public static void main(String [] args) { //arreglo int Entrada[] = { 321. obtenemos [10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45]. } } public static void shellSort( int vec[]) { // saltos for( int p = vec. y mi nombre nunca debe adjuntarse a éste. i++) { System. j >= p && tmp < vec[j . se ha movido hasta el extremo inicial. el 10 que estaba en el extremo final. for (int i = 0. i < vec. y después un ordenamiento con un espacio de 1 posición (ordenamiento por inserción simple). Algunos libros de texto y referencias antiguas le llaman ordenación "Shell-Metzner" por Marlene Metzner Norton. 15 }. Donald Shell. que lo publicó en 1959. lo que nos da 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 Cuando lo leemos de nuevo como una única lista de números. 234.p].length. Esto quedaría así: 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 Entonces ordenamos cada columna. pero según Metzner. 213. "No tengo nada que ver con el algoritmo de ordenamiento.print(Entrada[i]+" "). //llamada shellSort(Entrada).length / 2. 4.

Radix sort MSD trabaja en sentido contrario. 4. d. g. por lo que procesar los dígitos de las representaciones de enteros por representaciones de grupos de dígitos binarios es lo más conveniente. h. 10". Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les llama a menudo "claves". f. e. Radix sort LSD usa típicamente el siguiente orden: claves cortas aparecen antes que las claves largas. j". nombres o fechas) y. ba" será ordenada léxicamente como "b. como las palabras o representaciones de enteros de longitud fija. 4. 8. radix sort no está limitado sólo a los enteros. La mayor parte de los ordenadores digitales representan internamente todos sus datos como representaciones electrónicas de números binarios. Una secuencia como "b. el ordenamiento Radix (radix sort en inglés) es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual. j. 7. ALGORITMOS DE ORDENAMIENTO EXTERNO ME TODO DE ORDENAMIENTO DE MEZCLAS . 9. especialmente. c.} } METODO DE ORDENAMIENTO RADIX En informática. como la secuencia "1. 7. 3. que es ideal para la ordenación de cadenas de caracteres. como si las claves más cortas estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco. h. Como los enteros pueden representar cadenas de caracteres (por ejemplo. 5. 2. g. i. 8. para el propósito de este ordenamiento. 6. 10. 6. e. 2. números en punto flotante especialmente formateados. Radix sort LSD procesa las representaciones de enteros empezando por el dígito menos significativo y moviéndose hacia el dígito más significativo. 9". Radix sorts MSD usa orden léxico. entonces la ordenación de las representaciones de los números del 1 al 10 será "1. 5. y claves de la misma longitud son ordenadas de forma léxica. Si se usa orden léxico para ordenar representaciones de enteros de longitud variable. Esto coincide con el orden normal de las representaciones de enteros. i. que pueden existir por sí mismas o asociadas a otros datos. ba. para hacerlas tan largas como la clave más larga. d. f. 3. Existen dos clasificaciones de radix sort: el de dígito menos significativo (LSD) y el de dígito más significativo (MSD). c.