Python de classificação rápida

Python de classificação rápida
O Quicksort é um algoritmo de classificação bem querido que é frequentemente usado. Na primeira metade deste post, usaremos números inteiros simples, mas mostraremos como adaptar essa técnica para classificar objetos de uma classe personalizada. Quicksort representa algoritmos de classificação de divisão e conquista, no local e instáveis. Antes de classificar recursivamente as matrizes maiores, dividir e conquistar dividir a matriz em matrizes mais curtas até encontrar uma matriz vazia, mesmo uma com apenas uma entrada. A matriz ou qualquer subarrays não são duplicados quando usados ​​no lugar. No entanto, todas as chamadas recursivas que ele exige exigir a memória da pilha. Um algoritmo de classificação instável não garante isso; Pode acontecer, mas não é garantido. Isso é principalmente relevante ao classificar objetos em vez de tipos primitivos.

Exemplo 1:

Começamos escolhendo um elemento dinâmico. Então, para percorrer todos os elementos da lista, usamos o Python para o loop. Se um número for <= 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.

O método preparar () é então chamado pelo nosso código. Isso localiza um ponteiro de pivô e transfere coisas para seus locais adequados. O método quicksort () é chamado duas vezes pelo nosso programa. Usamos o Quicksort nas peças à esquerda do pivô pela primeira vez. Para a segunda tentativa, usamos o Quicksort nos objetos à direita do pivô. Como resultado, porque se chama, nossa função é recursiva. Vamos agora criar um programa primário que cria uma lista classificável. Começamos especificando um conjunto de valores para classificar. A função python len () é usada para determinar o comprimento do nosso conjunto de atributos. Depois disso, o método QuickSort () é aplicado.

def preparar (dados, low_point, high_point):
pivô = dados [high_point]
n = low_point - 1
para i em range (low_point, high_point):
Se dados [i] <= pivot:
n = n + 1
(dados [n], dados [i]) = (dados [i], dados [n])
(Dados [n + 1], dados [High_Point]) = (Data [High_Point], Data [n + 1])
retornar n + 1
DEF Quick_Sort (Data, Low_Point, High_Point):
Se Low_Pointpivot = preparar (dados, low_point, high_point)
Quick_sort (Dados, Low_Point, Pivot - 1)
Quick_sort (dados, pivô + 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)

Aqui você pode ver que os dados são classificados.

Exemplo 2:

Usaremos duas funções neste exemplo: Partition () e Quicksort (). A função Quicksort () particiona primeiro a coleção e depois se chama recursivamente nas peças particionadas. Primeiro, vejamos a função Division (). O pivô foi definido primeiro, como você pode ver no código. Se o valor que estamos vendo agora é maior que o pivô. Podemos passar para a próxima peça à esquerda porque está no lado direito do pivô. Também devemos garantir que não passamos o ponteiro baixo, o que indica que todos os elementos foram movidos para o lado correto do pivô. Depois disso, o método oposto ao acima é realizado. Nós encontramos um número fora de ordem para High_Point e Low_Point, ou Low_Point é maior que o High_Point, nesse caso, deixaremos o loop. Finalmente, vamos colocar o código quicksort () em ação. Podemos usar o QuickSort () em uma matriz básica para implementar as duas funções (Partição e Quicksort).

Def Partition (arr1, start, fim):
pivô = ARR1 [Start]
low_point = Iniciar + 1
high_point = end
enquanto é verdade:
Enquanto Low_Point = Pivot:
High_Point = High_Point - 1
enquanto low_point<= high_point and arr1[low_point] <= pivot:
low_point = low_point + 1
se lOW_Point = end:
retornar
p_func = partição (arr1, start, fim)
Quick_sort (arr1, start, 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)
Impressão (ARR1)

Este é o resultado. Não há garantia de que esses dois 22s estivessem nessa ordem porque o método é instável. Talvez eles tenham sido trocados a princípio, mas isso não implica nada em uma matriz inteira.

Exemplo 3:

Vamos classificar objetos personalizados neste exemplo. Existem várias maneiras diferentes de estender esse algoritmo para classificar objetos personalizados no Python. Os operadores de comparação para uma classe específica podem ser implementados em um estilo pitônico, o que significa que não teríamos que alterar o algoritmo porque>, ==, =, etc., funcionaria melhor em nosso objeto de classe. Mais uma opção é fazer com que o chamador forneça ao nosso algoritmo um método, que seria utilizado para executar a comparação real de itens. É muito simples reescrever o algoritmo para uso com objetos sob medida. No entanto, lembre -se de que o algoritmo não é completamente estável. Vamos começar com a aula de estudante. Esta aula tem apenas duas características: o nome e a idade do aluno. Vamos resolver a idade, o que realizaremos dando ao algoritmo de classificação uma nova função lambda. Mas primeiro, vamos ver como essa função é usada no algoritmo. Em vez de usar os operadores = ou> = para fazer uma comparação direta, usamos a função para determinar qual aluno é mais antigo. Lambda transmite o objeto em comparação com a chamada rápida, que faz a comparação exata de atributo de idade.

Aluno da aula:
def __init __ (self, nome_of_student, idade):
auto.name_of_student = name_of_student
auto.idade = idade
def __str __ (self):
retornar a si mesmo.nome do estudante
Def Partition (ARR1, Start, End, Compare_func):
pivô = ARR1 [Start]
low_point = Iniciar + 1
high_point = end
enquanto é verdade:
enquanto low_point<= high_point and compare_func(arr1[high_point], pivot):
High_Point = High_Point - 1
enquanto low_point<= high_point and not compare_func(arr1[low_point], pivot):
low_point = low_point + 1
se lOW_Point = end:
retornar

Aqui você pode ver a lista classificada de nomes.

Conclusão:

Uma matriz é subdividida usando o algoritmo Python Quicksort e, em seguida, classifique cada entrada na lista; Este método chama esses sub -matrizes repetidamente. Passamos por esse conceito em profundidade com exemplos neste artigo.