Python de clasificación rápida

Python de clasificación rápida
Quicksort es un algoritmo de clasificación muy querido que se usa con frecuencia. En la primera mitad de esta publicación, usaremos enteros simples, pero mostraremos cómo adaptar esta técnica para clasificar los objetos de una clase personalizada. Quicksort representa algoritmos de clasificación divididos y concurridos, en el lugar e inestables. Antes de clasificar recursivamente las matrices más grandes, divide y conquista divide la matriz en matrices más cortas hasta que encuentre una matriz vacía, incluso una con solo una entrada. La matriz o cualquier subarray no se duplican cuando se usan en su lugar. Sin embargo, todas las llamadas recursivas que hace que requiere memoria de pila. Un algoritmo de clasificación inestable no garantiza esto; puede suceder, pero no está garantizado. Esto es principalmente relevante al clasificar objetos en lugar de tipos primitivos.

Ejemplo 1:

Comenzamos eligiendo un elemento dinámico. Luego, para recorrer todos los elementos de la lista, usamos Python para el bucle. Si un número es <= to the pivot, it is shifted to the left. Otherwise, it shifts to the right side of the pivot. Our Python program returns the new high value. Item + 1 equals the new high value. After that, we must execute our algorithm. A separate procedure can be created to achieve this. This function compares the values of “low_point” and “high_point” to test if “low_pont” is less than “high_point.” We'll be likely to progress if that's the case. Otherwise, our sorting will come to a halt. When our sorting comes to a halt, it signifies the list has been sorted.

El método preparar () se llama por nuestro código. Esto localiza un puntero de pivote y transfiere las cosas a sus ubicaciones adecuadas. El método QuickSort () es llamado dos veces por nuestro programa. Usamos Quicksort en las piezas a la izquierda del pivote por primera vez. Para el segundo intento, usamos QuickSort en los objetos a la derecha del pivote. Como resultado, debido a que se llama a sí mismo, nuestra función es recursiva. Ahora creemos un programa primario que crea una lista ordenable. Comenzamos especificando un conjunto de valores para clasificar. La función python len () se usa para determinar la longitud de nuestro conjunto de atributos. Después de eso, se aplica el método QuickSort ().

Def preparar (datos, Low_Point, High_Point):
pivot = data [high_point]
n = Low_Point - 1
Para I en el rango (Low_Point, High_Point):
Si los datos [i] <= pivot:
n = n + 1
(datos [n], datos [i]) = (datos [i], datos [n])
(datos [n + 1], datos [high_point]) = (datos [high_point], datos [n + 1])
RETURN N + 1
Def Quick_Sort (Data, Low_Point, High_Point):
Si Low_Pointpivot = preparar (datos, low_point, high_point)
Quick_sort (datos, Low_Point, Pivot - 1)
Quick_sort (datos, pivote + 1, high_point)
my_list = [9, 5, 1, 7, 4, 2]
Total = len (my_list)
Quick_sort (my_list, 0, total - 1)
imprimir (my_list)

Aquí puede ver que los datos están ordenados.

Ejemplo 2:

Usaremos dos funciones en este ejemplo: Partition () y Quicksort (). La función QuickSort () divide la colección primero, luego se llama a sí misma recursivamente en las piezas particionadas. Primero, veamos la función de división (). El pivote se estableció primero, como puede ver en el código. Si el valor que estamos viendo en este momento es más alto que el pivote. Podemos pasar a la siguiente pieza a la izquierda porque está en el lado derecho del pivote. También debemos asegurarnos de no haber pasado el puntero bajo, lo que indica que todos los elementos se han movido al lado correcto del pivote. Después de eso, se lleva a cabo el método opuesto al anterior. Hemos encontrado un número fuera de orden para High_Point y Low_Point, o Low_Point es mayor que High_Point, en cuyo caso dejaremos el bucle. Finalmente, pongamos el código QuickSort () en acción. Podemos usar QuickSort () en una matriz básica para implementar ambas funciones (Partition y QuickSort).

Partition Def (arr1, inicio, final):
pivot = arr1 [inicio]
Low_point = inicio + 1
high_point = final
Mientras que es cierto:
mientras que Low_Point = Pivot:
high_point = high_point - 1
Mientras que Low_Point<= high_point and arr1[low_point] <= pivot:
Low_Point = Low_Point + 1
Si Low_Point = End:
devolver
p_func = particion (arr1, inicio, final)
Quick_sort (arr1, inicio, p_func-1)
Quick_sort (arr1, p_func+1, final)
arr1 = [23,22,56,4,26,77,10,33,44,12,57,78,22,83,43,31,98,76]
Quick_sort (arr1, 0, len (arr1) - 1)
Imprimir (ARR1)

Este es el resultado. No hay garantía de que estos dos 22 estuvieran en este orden porque el método es inestable. Tal vez se cambiaron al principio, pero eso no implica nada en una matriz entera.

Ejemplo 3:

Vamos a clasificar objetos personalizados en este ejemplo. Hay varias formas diferentes de extender este algoritmo para ordenar objetos personalizados en Python. Los operadores de comparación para una clase específica podrían implementarse en un estilo pitónico, lo que significa que no tendríamos que cambiar el algoritmo porque>, ==, =, etc., funcionaría lo mejor de nuestro objeto de clase. Una opción más es hacer que la persona que llama proporcione a nuestro algoritmo un método, que luego se utilizaría para realizar la comparación de elementos real. Es bastante simple reescribir el algoritmo para su uso con objetos a medida. Sin embargo, tenga en cuenta que el algoritmo no es completamente estable. Comencemos con la clase de estudiantes. Esta clase tiene solo dos características: el nombre y la edad del estudiante. Ordenaremos por edad, que lograremos dando al algoritmo de clasificación una nueva función Lambda. Pero primero, veamos cómo se usa esta función en el algoritmo. En lugar de usar los operadores = o> = para hacer una comparación directa, usamos la función para determinar qué estudiante es mayor. Lambda transmite el objeto en comparación con la llamada de clasificación rápida, que hace la comparación de atributos de edad exacta.

Estudiante de clase:
def __init __ (self, name_of_student, edad):
ser.name_of_student = name_of_student
ser.edad = edad
def __str __ (self):
volver a ser.nombre de estudiante
Partition Def (arr1, inicio, finalización, comparación_func):
pivot = arr1 [inicio]
Low_point = inicio + 1
high_point = final
Mientras que es cierto:
Mientras que Low_Point<= high_point and compare_func(arr1[high_point], pivot):
high_point = high_point - 1
Mientras que Low_Point<= high_point and not compare_func(arr1[low_point], pivot):
Low_Point = Low_Point + 1
Si Low_Point = End:
devolver

Aquí puedes ver la lista ordenada de nombres.

Conclusión:

Una matriz se subdivide utilizando el algoritmo Python Quicksort y luego ordene cada entrada en la lista; Este método llama a estas medias subcuencicas repetidamente. Hemos pasado por este concepto en profundidad con ejemplos en este artículo.