Algoritmo de clasificación-clasificación y optimización de burbujas

Clasificación de burbujas

Idea básica : compare los valores de los elementos adyacentes tratando la secuencia ordenada de adelante hacia atrás (comenzando desde el elemento con el subíndice más pequeño) e intercambie si se encuentra el orden inverso, de modo que el elemento con el valor más grande se mueva gradualmente de adelante hacia atrás. Gradualmente se eleva
hacia arriba como burbujas de aire debajo del agua .

Porque en el proceso de clasificación, cada elemento se acerca constantemente a su posición. Si no hay intercambio en una comparación, significa que la secuencia está ordenada. Por lo tanto, se debe establecer un indicador en el proceso de clasificación para determinar si el elemento se ha intercambiado. De este modo, se reducen las comparaciones innecesarias. (La optimización mencionada aquí puede llevarse a cabo después de que se escriba la clasificación de burbujas)

Ponga una foto, por favor comprenda
usted mismo. Aquí está el proceso específico de burbujeo:
Inserte la descripción de la imagen aquí

Análisis de ideas de algoritmos.

Aquí hay un ejemplo para explicar, hay una matriz desordenada arr [3,9, -1,0, -2]

La primera comparación: comenzamos con el primer número y vemos si el primer número es mayor que el segundo número: si es mayor, intercambie las posiciones de los dos, de lo contrario no se realiza ninguna operación. Repita esta operación hasta la penúltima posición, que es arr.length-1. A través de esta comparación, encontramos el número 9 más grande en esta matriz, que burbujeará hasta el final de la matriz.

arr [3 , -1,0 , -2,9]

Segunda comparación: esta comparación es casi la misma que la primera. El único cambio es que no es necesario comparar el penúltimo y el penúltimo.

arr [-1,0 , -2,3,9]

La tercera comparación: aquí es lo mismo que arriba, pero la comparación es una vez menos.

arr [-1 , -2,0,3,9]

Cuarta comparación: sin explicación, resuma usted mismo.

arr [-2 , -1,0,3,9]

En este punto, la operación de clasificación de la matriz ha terminado. Puede ver que cada comparación debe mover el valor máximo de la parte de comparación actual al final de la parte de clasificación actual de la matriz intercambiando. Cada ciclo es equivalente a agregar un número ya ordenado.

arr = [0 for i in range(8000)]
for i in range(8000):
    arr[i]=random.randint(0,8000)
#基本的冒泡排序
def BubleSort(arr):
    temp = 0
    #总共要进行数组长度减1的大循环
    for i in range(len(arr)-1):
    #每次内循环都会冒出一个最小或者最大值,故下次循环比较次数-1
        for j in range(len(arr)-1-i):
            if arr[j]>arr[j+1]:
                t=arr[j]
                arr[j]=arr[j+1]
                arr[j+1]=t

print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
BubleSort(arr)
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
#输出结果
print("普通版的冒泡排序")
print(arr)

Si lo ha entendido antes, eche un vistazo al código anterior, si las condiciones lo permiten. Puede ejecutarlo en su computadora, encontrará que cuando los datos alcanzan 8000, la eficiencia de tiempo de la computadora para usar el ordenamiento de burbujas no es alta. En teoría, la complejidad temporal del ordenamiento de burbujas es O (n ^ 2), en Toma alrededor de 13 segundos obtener resultados en mi computadora. Este tiempo está relacionado con las condiciones del hardware. Si su computadora está en mejores condiciones, el tiempo será más corto. ¿Pero cómo mejorar el algoritmo?

Optimización de clasificación de burbujas

De hecho, encontrará que si los datos se ordenaron originalmente a tiempo, o se ordenaron parcialmente, como 1, 2, 3, 4, 5. De hecho, cuando atraviese, puedo encontrar que no ingresó la declaración de cambio una vez, entonces esto ya es Matriz ordenada. Después de una ligera modificación, el código es el siguiente:

arr2 = [0 for i in range(8000)]
for i in range(8000):
    arr2[i]=random.randint(0,8000)
#冒泡排序优化
def BubleSort2(arr):
    temp = 0
    flag = False
    #总共要进行数组长度减1的大循环
    for i in range(len(arr)-1):
        flag = False
    #每次内循环都会冒出一个最小或者最大值,故下次循环比较次数-1
        for j in range(len(arr)-1-i):
            if arr[j]>arr[j+1]:
                flag = True
                t=arr[j]
                arr[j]=arr[j+1]
                arr[j+1]=t
        #如果没有一次进入交换语句,说明后面的数字都已经有序
        if flag == False:
            break
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
BubleSort2(arr2)
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
print("优化后的冒泡排序")
print(arr2)

Puede probar si el tiempo de ejecución se acorta en su computadora, pero cuando lo pruebo en mi computadora, la diferencia no es grande. Ocasionalmente acorta el tiempo de ejecución en un segundo, a veces incluso no hace ninguna diferencia.

27 artículos originales publicados · elogiados 2 · visitas 680

Supongo que te gusta

Origin blog.csdn.net/qq_44273739/article/details/105182441
Recomendado
Clasificación