Acerca de la optimización del algoritmo de clasificación de burbujas de Java

El algoritmo de clasificación de burbujas más básico

// Java冒泡排序算法(最基础版本)
import java.util.Arrays;

//研究冒泡排序
public class BubbleSort {
    
    
	public static void main(String[] args) {
    
    
		//arrays自带的排序方法
		int[] a = {
    
    3,1,4,5,6};
		/*Arrays.sort(a);
		System.out.println(Arrays.toString(a));*/
		int inner = 0;
		int outner = 0;
		
		for (int j = 0; j < a.length; j++) {
    
    
			for (int i = 0; i < a.length-1; i++) {
    
    
				if (a[i]>a[i+1]) {
    
    
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
				System.out.println("当前内循环的次数:" + (++inner));
			}
			System.out.println("当前外循环的次数为:" + (++outner)+"当前数组的输出为:"+Arrays.toString(a));
		}
		
		System.out.println(Arrays.toString(a));
		
	}
}

La salida del algoritmo es la siguiente:
Inserte la descripción de la imagen aquí

Este es el primer algoritmo de clasificación de burbujas escrito por la mayoría de las personas (para mostrar la calidad del algoritmo de optimización de manera más intuitiva a continuación, registre directamente el número de bucles internos y externos en el código), cada programador futuro que aprenda Java, puede que todos experimentar este algoritmo más básico, y ¿ha pensado en hacer algunas optimizaciones para este algoritmo?
Las dos optimizaciones del algoritmo que resumí a continuación:

Algoritmo de optimización (1). Acerca de la reducción del número de veces que se recorre la matriz cada vez

// 第一次优化
import java.util.Arrays;

//研究冒泡排序
public class BubbleSort {
    
    
	public static void main(String[] args) {
    
    
		//arrays自带的排序方法
		int[] a = {
    
    3,1,4,5,6};
		/*Arrays.sort(a);
		System.out.println(Arrays.toString(a));*/
		int inner = 0;
		int outner = 0;
		
		for (int j = 0; j < a.length-1; j++) {
    
    
			for (int i = 0; i < a.length-1-j; i++) {
    
    
				if (a[i]>a[i+1]) {
    
    
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
				System.out.println("当前内循环的次数:" + (++inner));
			}
			
			System.out.println("当前外循环的次数为:" + (++outner)+"当前数组的输出为:"+Arrays.toString(a));
		}
		
		System.out.println(Arrays.toString(a));
		
	}
}

La salida después de la primera optimización es la siguiente: ¡
Inserte la descripción de la imagen aquí
El número de bucles internos se reduce a la mitad!
A través de cada bucle interno, se obtiene un valor máximo y se coloca al final de la matriz, y el segundo recorrido omite directamente este número. ¡Obtenga la primera optimización!

Utilice el principio de apertura y cierre para un recorrido de interrupción anticipada (versión final)

// 利用闭合原则对算法的二次优化
import java.util.Arrays;

//研究冒泡排序
public class BubbleSort {
    
    
	public static void main(String[] args) {
    
    
		//arrays自带的排序方法
		int[] a = {
    
    3,1,4,5,6};
		/*Arrays.sort(a);
		System.out.println(Arrays.toString(a));*/
		int inner = 0;
		int outner = 0;
		
		for (int j = 0; j < a.length-1; j++) {
    
    
			boolean flag = true;
			for (int i = 0; i < a.length-1-j; i++) {
    
    
				if (a[i]>a[i+1]) {
    
    
					flag = false;
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
				System.out.println("当前内循环的次数:" + (++inner));
			}
			
			System.out.println("当前外循环的次数为:" + (++outner)+"当前数组的输出为:"+Arrays.toString(a));
			if (flag) {
    
    
				System.out.println("提前就结束啦!");
				break;
			}
		}
		
		System.out.println(Arrays.toString(a));
		
	}
}

La salida del algoritmo es la siguiente:
Inserte la descripción de la imagen aquí
una vez más se reduce el número de recorridos !!!
Al definir una bandera de variable de tipo booleano en el bucle externo, si la instrucción if del bucle interno no se ejecuta, significa que no se ejecuta ningún elemento. movido en el bucle, es decir, la matriz en este momento La clasificación se ha completado y no es necesario volver a ordenar.

Conclusión

Cuando aprendimos Java por primera vez, no era necesario aprender rápido. Después de aprender cada punto de conocimiento, debemos profundizar y es posible que encuentres otras cosas increíbles.

Supongo que te gusta

Origin blog.csdn.net/xiaole060901/article/details/107574678
Recomendado
Clasificación