Aprendizaje del lenguaje C: elementos de matriz de clasificación de burbujas

En el desarrollo real, hay muchos escenarios que requieren que organicemos los elementos de la matriz en orden de mayor a menor (o de menor a mayor), para que sea más intuitivo al buscar datos, por ejemplo:

Una matriz que ahorra los precios unitarios de los productos básicos y es más fácil ver su rentabilidad después de la clasificación.

Hay muchas formas de ordenar los elementos de una matriz, como la clasificación por burbujas, la clasificación por fusión, la clasificación por selección, la clasificación por inserción, la clasificación rápida, etc. Entre ellas, la más clásica que debe dominarse es la "clasificación por burbujas".

Tomando la clasificación de pequeña a grande como ejemplo, la idea general de la clasificación de burbujas es la siguiente:

Comenzando desde la cabeza de la matriz, compare continuamente los tamaños de dos elementos adyacentes y deje que el elemento más grande se mueva gradualmente hacia atrás (intercambie los valores de los dos elementos) hasta el final de la matriz. Después de la primera ronda de comparación, se puede encontrar el elemento más grande y moverlo a la última posición.

Después de la primera ronda, continúe con la segunda ronda. La comparación sigue siendo desde el principio de la matriz, y los elementos más grandes se mueven gradualmente hacia atrás hasta que se alcanza el penúltimo elemento de la matriz. Después de la segunda ronda de comparación, puede encontrar el segundo elemento más grande y colocarlo en la penúltima posición.

Por analogía, después de n-1 (n es la longitud de la matriz) rondas de "burbujeo", se pueden organizar todos los elementos.

Todo el proceso de clasificación es como burbujas que salen constantemente del agua, la más grande sale primero, la segunda más grande sale en segundo lugar y la más pequeña sale al final, por lo que este método de clasificación se llama clasificación de burbujas (Bubble Sort).

A continuación, tomamos "3 2 4 1" como ejemplo para ilustrar la clasificación de burbujas.

La primera ronda del proceso de clasificación

3 2 4 1 (primero)

2 3 4 1 (comparar 3 y 2, intercambiar)

2 3 4 1 (Compare 3 y 4 sin intercambiar)

2 3 1 4 (Compare 4 y 1, intercambie)

Al final de la primera ronda, el número 4 más grande ya está al final, por lo que la segunda ronda de clasificación solo necesita comparar los primeros tres números.

La segunda ronda del proceso de clasificación

2 3 1 4 (Resultados de la primera ronda de clasificación)

2 3 1 4 (Compare 2 y 3, no intercambie)

2 1 3 4 (Compare 3 y 1, intercambie)

Al final de la segunda ronda, el siguiente número más grande 3 ya se encuentra en la penúltima posición, por lo que la tercera ronda solo necesita comparar los dos primeros elementos.

La tercera ronda del proceso de clasificación

2 1 3 4 (la segunda ronda de resultados de clasificación)

1 2 3 4 (Compare 2 y 1, intercambie)

En este punto, la clasificación ha terminado.

Resumen e implementación del algoritmo

Realice n-1 rondas de comparación en la matriz R [n] con n elementos.

En la primera ronda, compare (R [1], R [2]), (R [2], R [3]), (R [3], R [4]), ……. (R [N- 1], R [N]), el elemento más grande se mueve a R [n].

En la segunda ronda, compare (R [1], R [2]), (R [2], R [3]), (R [3], R [4]), ……. (R [N- 2], R [N-1]), el siguiente elemento más grande se mueve a R [n-1].

。。。。。。

Y así sucesivamente, hasta que toda la matriz se ordene de pequeña a grande.

La implementación del código específico es la siguiente:

#include <stdio.h>

int main () {

  números internos [10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};

  int i, j, temp;

  // Algoritmo de clasificación de burbujas: realiza n-1 rondas de comparación

  para (i = 0; i <10-1; i ++) {

    // Compara el primer n-1-i de cada ronda, es decir, el último i que me han ordenado sin comparación

    para (j = 0; j <10-1-i; j ++) {

      if (números [j]> números [j + 1]) {

        temp = números [j];

        números [j] = números [j + 1];

        nums [j + 1] = temp;

      }

    }

  }

 

  // Salida de la matriz ordenada

  para (i = 0; i <10; i ++) {

    printf ("% d", nums [i]);

  }

  printf ("\ n");

 

  return 0;

}

resultado de la operación:

1 2 3 4 5 6 7 8 9 10

mejoramiento

El algoritmo anterior es el algoritmo proporcionado en la mayoría de los libros de texto, uno de los cuales se puede optimizar: cuando se compara la i-ésima ronda, si los elementos restantes ya están ordenados, entonces no hay necesidad de continuar la comparación y el ciclo se termina Sin embargo, esto reduce el número de comparaciones y mejora la eficiencia de ejecución.

El algoritmo no optimizado definitivamente realizará n-1 rondas de comparación, y el algoritmo optimizado realizará como máximo n-1 rondas de comparación.

La implementación del algoritmo optimizado es la siguiente:

#include <stdio.h>

int main () {

  números internos [10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};

  int i, j, temp, isSorted;

 

  // Algoritmo de optimización: como máximo n-1 rondas de comparación

  para (i = 0; i <10-1; i ++) {

    isSorted = 1; // Suponiendo que los elementos restantes han sido ordenados

    para (j = 0; j <10-1-i; j ++) {

      if (números [j]> números [j + 1]) {

        temp = números [j];

        números [j] = números [j + 1];

        nums [j + 1] = temp;

        isSorted = 0; // Una vez que los elementos de la matriz deben intercambiarse, significa que los elementos restantes no están bien ordenados

      }

    }

    if (isSorted) break; // Si no se produce ningún intercambio, los elementos restantes se han ordenado

  }

  para (i = 0; i <10; i ++) {

    printf ("% d", nums [i]);

  }

  printf ("\ n");

 

  return 0;

}

Establecemos una variable adicional isSorted y la usamos como una bandera. Un valor de "true" indica que los elementos restantes se han ordenado, y un valor de "false" indica que los elementos restantes aún no se han ordenado.

Antes de cada ronda de comparación, presuponemos que los elementos restantes se han ordenado y se ha establecido como "verdadero". Una vez que los elementos deben intercambiarse durante la comparación, significa que la suposición es incorrecta y los elementos restantes no están ordenados. , Por lo tanto, el valor de isSorted se cambia a "falso".

Después de cada ronda del ciclo, al verificar el valor de isSorted, sabemos si los elementos restantes están ordenados.

 

Además, si desea mejorar su capacidad de programación, ¡aprenda el lenguaje C y la programación C ++! Adelantar en una curva, ¡un paso más rápido! Puede que pueda ayudarte aquí ~

UP ha subido a la página de inicio algunos tutoriales en vídeo sobre el aprendizaje de la programación C / C ++. ¡Aquellos que estén interesados ​​o estén aprendiendo deben ir y echar un vistazo! Te será de ayuda ~

Compartir (código fuente, video del proyecto real, notas del proyecto, tutorial introductorio básico)

¡Bienvenidos socios que cambian de carrera y aprenden programación, use más información para aprender y crecer más rápido que si lo piensa usted mismo!

Programación de aprendizaje:

Programación de aprendizaje:

Supongo que te gusta

Origin blog.csdn.net/weixin_45713725/article/details/114636865
Recomendado
Clasificación