1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from typing import List


def quicksort(l: List):
    """
    Recebe uma lista de elementos e devolve eles ordenados
    """

    # Caso base! Nunca se esqueça disso em funções recursivas@
    if not len(l):
        return l

    # Escolhemos um pivot, removemos ele da lista!
    # Reduzir a entrada também é essêncial!
    pivot = l.pop(0)

    # Separamos os elementos menores
    lower = [e for e in l if e <= pivot]
    # Separamos os maiores
    uppper = [e for e in l if e > pivot]

    # Os menores ficam na esquerda do pivo
    # Os maiores ficam na direita
    # Ai acontece a magia da recursão... 
    # Ordedamos os menores e os maiores com a mesma função.
    return quicksort(lower) + [pivot] + quicksort(uppper)


def main():
    elems = [3,2,3,6,7,4,2,-1]

    print(quicksort(elems))


if __name__ == '__main__':
    main()