Python implementa la clasificación de cubos

Python implementa la clasificación de cubos

1. Introducción a la clasificación de cubetas

La clasificación de contenedores es un algoritmo de clasificación implementado mediante agrupamiento y fusión, también conocido como clasificación de contenedores.

La clasificación de depósitos primero divide los datos en un número limitado de depósitos y luego clasifica los datos en cada depósito (la clasificación en depósitos puede usar cualquier algoritmo de clasificación, como la clasificación rápida) y, finalmente, fusiona todos los depósitos ordenados en una secuencia ordenada, el la lista está ordenada.

La clasificación de depósitos ocupa mucho espacio adicional. Para clasificar los datos en el depósito, la elección del algoritmo de clasificación es muy importante para el rendimiento. No hay muchos escenarios en los que sea aplicable la clasificación por cubos, y los más utilizados son la clasificación por conteo y la clasificación cardinal basada en la idea de la clasificación por cubos.

En segundo lugar, el principio de clasificación de cubos

El principio de clasificación de cubos es el siguiente:

1. Encuentre los valores máximo y mínimo en la lista que se van a ordenar y obtenga el rango de datos.

2. Según el rango de datos, seleccione un valor adecuado para construir un número limitado de depósitos y determine el rango de datos de cada depósito. Si el rango de datos es [0,100), divida los datos en 10 depósitos, el primer depósito es [0,10), el segundo depósito es [10,20), y así sucesivamente.

3. Asigne los datos de la lista para clasificarlos en los depósitos correspondientes.

4. Ordene los datos en cada depósito. Aquí se puede utilizar cualquier algoritmo de clasificación. Se recomienda utilizar un algoritmo de clasificación con poca complejidad de tiempo.

5. Saque los datos en todos los depósitos uno por uno y agréguelos a una nueva secuencia ordenada, y la clasificación de la lista estará completa.

Tome la lista [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8] en orden ascendente como ejemplo. El estado inicial de la lista se muestra en la siguiente figura.

1. Busque los valores máximo y mínimo en la lista para ordenar y seleccione un valor para asignar el número de depósitos. El valor máximo en el ejemplo es 9 y el valor mínimo es 2, y se asignan tres depósitos.

2. Visite la lista para ordenar y asigne cada dato al grupo correspondiente por turno. 5 pertenece al alcance del segundo cubo y se coloca en el segundo cubo.

3. Continúe visitando la lista para ordenar y ordenar los depósitos. 7 pertenece al alcance del segundo cubo y se coloca en el segundo cubo.

4. Continúe visitando la lista para ordenar y ordenar los depósitos. 3 pertenece al rango del primer cubo y se coloca en el primer cubo.

5. Continúe visitando la lista para ordenar y dividir cubos. 7 pertenece al alcance del segundo cubo y se coloca en el segundo cubo.

6. Visite siempre la lista completa para ordenar y coloque todos los datos en el depósito correspondiente.

7. Para realizar la clasificación en el depósito de los datos de cada depósito, la lista que se va a clasificar debe clasificarse en orden ascendente, por lo que cada depósito se clasifica en orden ascendente.

8. Saque los datos de todos los depósitos uno por uno y agréguelos a la secuencia ordenada. Primero saque los datos del primer depósito, 2,2,3,3.

9. Continúe sacando los datos en el segundo depósito, 5,5,5,7,7,7.

10. Continúe sacando todos los datos de los depósitos y agréguelos a la secuencia ordenada La lista está ordenada. El resultado de la clasificación es como se muestra en la siguiente figura.

Tres, Python implementa la clasificación de cubos

# coding=utf-8
def bucket_sort(array):
    min_num, max_num = min(array), max(array)
    bucket_num = (max_num-min_num)//3 + 1
    buckets = [[] for _ in range(int(bucket_num))]
    for num in array:
        buckets[int((num-min_num)//3)].append(num)
    new_array = list()
    for i in buckets:
        for j in sorted(i):
            new_array.append(j)
    return new_array


if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8]
    print(bucket_sort(array))

resultado de la operación:

[2, 2, 3, 3, 5, 5, 5, 7, 7, 7, 8, 9]

En el código, use las funciones integradas de Python max () y min () para encontrar los valores máximo y mínimo en la lista para ordenar. Luego, establezca el rango de datos de cada depósito en 3, cree tres depósitos y luego agregue los datos a los depósitos correspondientes. Saque cada depósito y ordene los datos en cada depósito. La función integrada de Python sorted () se usa directamente en el código. Aquí también se pueden usar algoritmos de clasificación como la clasificación rápida. Una vez que se ordenan los datos de los depósitos, los datos de cada depósito se agregan secuencialmente a una secuencia ordenada y se ordena la lista.

La i en el código representa el i-ésimo segmento y j representa el j-ésimo dato después de ordenar los datos en el segmento.

En cuarto lugar, la complejidad temporal y la estabilidad de la clasificación de cubos.

1. Complejidad del tiempo

En la clasificación de cubos, se debe visitar cada elemento de la lista que se va a clasificar, y la longitud de la lista es n, y luego cada segmento debe clasificarse en el segmento. La peor complejidad de clasificación en un solo segmento es O (ni ^ 2), ni significa que hay ni datos en el i-ésimo depósito, hay un total de k depósitos y la complejidad de tiempo es n más la complejidad de tiempo de la clasificación en cada depósito. En el peor de los casos, todos los datos son dividido en un cubo En el interior, ni = n, la complejidad del tiempo es T (n) = n + n ^ 2, y luego multiplique el número de pasos para agrupar y clasificar (constante, no afecta la notación O grande), por lo que el La complejidad temporal de la clasificación de cubos es O (n ^ 2).

La situación óptima de la clasificación de depósitos es distribuir uniformemente los datos en cada depósito. En este momento, hay k depósitos y cada depósito tiene n / k datos. El tiempo promedio de complejidad de la clasificación en cada depósito es O (n / k * logn / k), la complejidad temporal de toda la clasificación del segmento es T (n) = n + k * n / k * logn / k, y cuando k = n, es decir, solo hay un elemento en cada segmento (no (Necesita ordenar en el cubo), la complejidad del tiempo es O (n).

2. Estabilidad

De acuerdo con el principio de clasificación de la clasificación por cubos, la lista que se va a clasificar se divide en cubos, se clasifica en cubos y se fusiona. Al realizar la clasificación en el cubo en cada cubo, se pueden utilizar diferentes algoritmos de clasificación. Algunos algoritmos de clasificación son estables y algunos algoritmos de clasificación son inestables, lo que afectará la estabilidad de la clasificación del cubo. Por lo tanto, la estabilidad de la clasificación de cubos depende de la estabilidad del algoritmo de clasificación de cubos.

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43790276/article/details/107398295
Recomendado
Clasificación