Ordenamiento de burbuja y el algoritmo de ordenación rápida

preámbulo:

Un algoritmo de ordenamiento de burbuja

Dos burbujas realización del programa especie

Tres algoritmo de ordenación rápida

Cuatro ordenación rápida realización del programa del algoritmo

El algoritmo de ordenación primera burbuja

breve introducción

Ordenar burbuja (burbuja Ordenar), es una ciencia de la computación más simple campo algoritmo de ordenación .

Se visitó en repetidas ocasiones los elementos de la columna para ordenar, con el fin de comparar dos elementos adyacentes, si su orden (como descendente, la primera letra de la A a la Z) errores que el intercambio se hizo cargo. Trabajando elemento visita se repite hasta que no haya necesidad de elementos adyacentes de intercambio, es decir, la columna de elemento ha sido ordenados completado.

El nombre proviene del algoritmo hecho de elementos más grandes intercambiarán gradualmente a través de un "flotar" a la parte superior del número de columna (ascendente o descendente), como si el dióxido de carbono burbujas en una bebida carbonatada finalmente flotar a la parte superior de la misma burbuja, de ahí el nombre" ordenar ".

principio

algoritmo de la burbuja principio de clasificación es el siguiente:

  1. Comparación de elementos adyacentes. Si el primero es mayor que el segundo, los dos de ellos intercambiaron.

  2. Hacer el mismo trabajo para cada par de elementos adyacentes, desde el principio del primer par hasta el final de la última pareja. En este punto, debe ser el último elemento es el número más grande.

  3. Repita estos pasos para todos los elementos, excepto el último.

  4. Continúa repetir los pasos anteriores para cada vez menos y menos elementos, un par de números hasta que no hay necesidad de comparar.

Análisis algoritmo

complejidad del tiempo

Si el estado inicial es el archivo de secuencia positiva, una pasada para completar el pedido. El número de comparaciones requeridas palabras clave  y registrar el número de móvil  

Han llegado a un mínimo:

  ,

  .

Por lo tanto, la mejor ordenación de burbuja tiempo de la complejidad es   .
Si el archivo original es en orden inverso, la necesidad de

  

Clasificación de viaje. Para ordenar por viaje

  

Comparación de veces que una palabra clave (1≤i≤n-1), y registrar cada comparación se debe mover tres veces para lograr el intercambio de registros de posición. En este caso, la comparación y alcanzó el máximo número de móvil:

El peor tiempo la complejidad de la ordenación de burbuja es

  .

 [1]  En resumen, por lo tanto, el tiempo medio de ordenamiento de burbuja complejidad global es

  .

la estabilidad algoritmo

Ordenamiento de burbuja son los pequeños elementos se mueven hacia adelante o hacia atrás en los grandes elementos. Comparación de dos elementos adyacentes que es más, también el intercambio se produce entre estos dos elementos. Por lo tanto, si los dos elementos son iguales, entonces el cambio no lo hará, y si no hay dos elementos iguales adyacentes, incluso si la parte delantera por intercambio pairwise los dos arriba adyacente, esta vez no será intercambiado, los mismos elementos antes y después de la orden no ha cambiado, por lo que el ordenamiento de burbuja es un algoritmo estable especie.

El segundo algoritmo de ordenamiento de burbuja

lenguaje C

#include <stdio.h>
#define ARR_LEN 255 / * longitud máxima de la matriz * /
#define elemType int / * Tipo de elemento * /
/ * burbuja tipo * /
/ * 1. Desde el elemento actual, hacia atrás comparando secuencialmente cada elemento adyacente, si la conmutación inversa * /
/ * 2. Repetir los pasos anteriores para todos los elementos, hasta último elemento * /
/ * elemType ARR []: la clasificación de la matriz de destino; int len: el número de elementos * /
void BubbleSort (elemType ARR [], int len) {
    TEMP elemType;
    I int, J;
    for (i = 0; I <len-1; i ++) / * el bucle exterior es ordenar el número de vueltas, el número len para Len 1-veces * /
        para (J = 0; J <; veces. len- 1-i J ++) {/ * el bucle interior es el número de veces por comparación viaje, el i-ésimo comparador de viaje lEN-i * /
            IF (ARR [J]> ARR [J + 1]) {/ * la comparación de elementos adyacentes, entonces el interruptor cuando el orden inverso (mayor que el derecho a la ascendente izquierdo, descendente y viceversa) * /
                TEMP = ARR [J];
                ARR [J] = ARR [J + 1];
                ARR [J + . 1] = TEMP;
            }
        }
}
 
int main (void) {
    elemType arr [ARR_LEN] = {3,5,1, -7,4,9, -6,8,10,4};
    int len = 10;
    int i;
    BubbleSort (arr, len);
    for (i = 0; i <len; i ++)
        printf ( "% d \ t", arr [i]);
    putchar ( '\ n');
    return 0;
}

3 Clasificación rápida Algoritmo

ordenación rápida (ordenación rápida) es una mejora en el ordenamiento de burbuja.

Rápida tipo propuesto por CAR Hoare en 1960. La idea básica es: un viaje al ordenar los datos que debe clasificarse en dos partes independientes, la parte en la que todos los datos que la otra parte de todos los datos a ser pequeñas, entonces este método de datos para las dos partes por separado rápido clasificación, su clasificación de todo el proceso puede ser de forma recursiva, con el fin de lograr los datos enteros en una secuencia ordenada.

Se proporciona para ordenar la matriz A [0] ...... A [N-1], seleccionar cualquiera de unos primeros datos (el primer número se elige generalmente array) de datos como una clave, y luego, de que es menor que el número de los cuales se coloca en izquierda, todo más grande que sus números se puso a su derecha, un proceso conocido como un viaje a ordenación rápida. Es de destacar que, rápida tipo no es un estable algoritmo de clasificación, es decir, las mismas posiciones relativas de la pluralidad de valores pueden fluctuar al final del algoritmo.

Un viaje al algoritmo de ordenación rápida es:

1) Conjunto de dos variables i, j, en el comienzo de la especie: i = 0, j = N-1;

2) al primer elemento de matriz como los datos de clave, asignado a Key , es decir Key = A [0];

3) buscar hacia adelante a partir de j, es decir, a partir de la búsqueda hacia adelante (J,), para encontrar un menos de primera clave valor A [j], el A [j] y A de cambio del valor [i];

4) comienzo de la parte posterior busco i, es decir, antes del inicio de la búsqueda hacia atrás (i ++), encontrar la primera es mayor que la clave de A [i], el A [i] y el intercambio A [j] de valor;

5) Repetir los pasos 3 y 4 hasta i = j; (3,4 paso, no encontró valor cualificado, es decir, 3 A [j] no es menor que la clave , en 4 A [i] no es mayor que la. Clave tiempo j cambiar, el valor de i tal que j = j-1, i = i + 1, hasta que encuentre el valor encontrado cualificado, cuando el cambio de i, j posición del puntero sin cambios. Además, i == j que proceso debe ser exactamente el tiempo i + J o completado, por lo que en este momento el final del ciclo).

Puede funcionar qsort () puede ser ordenado matriz directamente en el lenguaje C. 

uso:

qsort void (base void *, nelem int, ancho int, int (* FCMP) (* const vacío, const void *));

Parámetros:
  una primera dirección a ordenarse matriz
  2 para ser matriz ordenada elemento número
  3 en la huella del tamaño de cada elemento de
  puntero 4 puntos de una función para determinar secuencialmente un ordenamiento

complejidad del tiempo

Mejor de los casos el tiempo complejidad de O (nlogn), el proceso es más complejo, que no se repite aquí.

Cada toma el peor de los casos con el número (número de referencia) es el valor máximo / mínimo de la corriente a comparar es, en este caso, cada vez sólo para obtener un número de secuencia inferior al 1 (es decir, ya sea todo más grande que el número de referencia, o más pequeña que la referencia completa), entonces una burbuja tipo es equivalente, el número de comparaciones = (n - 1) + (n - 2) + ... + 2 + 1 = ( n - 1) * n / 2, en este caso el tiempo la complejidad es: O (n ^ 2). Por lo general, aparece en el peor de los casos: ser datos ordenados en sí ya es una secuencia positiva o fila orden inverso buena.

espacio complejidad

  De hecho, esto no es un buen cálculo de complejidad espacial, debido a que algunas personas utilizan la clasificación no-lugar, calculado como malo (porque algunas personas utilizan la matriz auxiliar, por lo que es necesario calcular el número de su elemento) ; voy a analizar en el espacio situ bajo complejidad clasificación rápida de la misma;

        En primer lugar el espacio quicksort utilizado es O (1), que es un nivel constante, y el espacio real es consumido por llamadas recursivas, porque cada necesario recursiva para mantener algunos de los datos;

     El óptimo complejidad espacio caso: O (log n); biseca la matriz cada vez que un caso

     El peor caso es la complejidad del espacio: O (n), y caso degenerado de ordenamiento de burbuja

 

Cuarto  rápida realización del programa algoritmo de ordenación

La ordenación rápida del más rápido, porque en comparación con el ordenamiento de burbuja, cada intercambio es a pasos agigantados. Cada vez al clasificar un punto de referencia establecido, el punto de referencia será inferior a igual al número de todos a la izquierda del punto de referencia, el punto de referencia será mayor que el número igual al total de referencia en el punto correcto. Así que cada vez que el cambio no será el mismo que el ordenamiento de burbuja sólo puede ser intercambiada entre los números adyacentes del intercambio de la gran más. Por lo tanto, el número total de comparación y de cambio tienen sería el aumento de la velocidad de menos natural. Por supuesto, en el peor de los casos, todavía puede ser el número dos adyacentes se intercambiaron. Así el peor momento de la complejidad ordenación rápida y ordenamiento de burbuja es el mismo es O (N2), su complejidad promedio de tiempo de O (NlogN).

Breve ordenar:
#include <stdio.h>
int A [101], n-; // Definir variables globales, estas variables requiere el uso de dos sub-funciones en
quicksort void (int izquierda, int derecha) {
    int I, J, T, TEMP;
    SI (a la izquierda> derecha)
        de retorno;
    TEMP = a [dejó]; // TEMP se almacena en el número de referencia
    I = left;
    J = derecha;
    el tiempo (! I = J) {// el orden es importante, primero desde la derecha para encontrar
        el tiempo (una [J]> = TEMP && I <J)
            J ,;
        el tiempo (un [I] <= TEMP && I <J) // encuentro la derecha
            I ++;       
        IF (I < j) lugares // de intercambio en los dos números de matriz
        {
            T = a [I];
            a [i] = a [J];
            un [j] = T;
        }
    }
    // los números de referencia mensajeras con el tiempo se
    una [ izquierda] = a [i];
    A [I] = TEMP;
    quicksort (de izquierda ,. 1-I); // continuar procesando la izquierda, hay un proceso recursivo
    quicksort (i + 1, a la derecha) ; // continuar procesando la derecha, hay una recursiva proceso
}
int main () {
    int i;
    // datos de lectura
    Scanf ( "% D", y n-);
    for (i = 1;. I <= N-; I ++)
        Scanf ( "% D", y a [I]) ;
    quicksort (1, n-.); // quicksort llamada
    después // ordena la salida
    para (i = 1;. I <n-; I ++)
        el printf ( "% D", un [I]);
    la printf ( "% D \ n-", A [n-]);
    return 0;
}
 

 

Publicado 43 artículos originales · ganado elogios 28 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/u013380694/article/details/90169202
Recomendado
Clasificación