Algoritmos de Ordenação – Python
Ordenação
Definição: organizar uma sequência de elementos de modo que os mesmos estabeleçam algumarelação de ordem.
Diz-se que os elementos k1, k2 …, kn estarão dispostos de modo que k1 ≤ k2 ≤ … ≤ kn.
Bubble sort
Ideia básica: Percorrer o conjunto várias vezes e a cada iteração, comparar cada elemento com seu sucessor (v[i] com v[i+1]) e trocá-los de lugar caso estejam na ordem incorreta.
def bubble_sort(v):
for i in range(len(v)-1):
for j in range(len(v)-i-1):
if(v[j]>v[j+1]):
v[j],v[j+1] = v[j+1],v[j]
u=[2,4,10,12,6,8,16,14] # Exemplo
print(u)
bubble_sort(u)
print(u)
Insertion sort
Ideia básica: Ordenar o conjunto inserindo os elementos em um subconjunto já ordenado.
No n-ésimo passo, inserir o n-ésimo elemento na posição correta entre x[0], …, x[n-1], que já estão em ordem (Realocar elementos).
def insertion_sort(v):
for i in range(1, len(v)):
aux = v[i]
j=i-1
while j>=0 and aux < v[j]:
v[j+1]=v[j]
j-=1
v[j+1]=aux
u=[3,5,11,13,7,9,17,15] # Exemplo
print(u)
insertion_sort(u)
print(u)
Download: http://valci.com.br/download/notebook/Ordenacao_Bubble-sort_e_Insertion-sort.ipynb
Outros Algoritmos de ordenação
Merge sort
# Merge sort
def merge_sort(alist):
print("Separando ",alist)
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
merge_sort(lefthalf)
merge_sort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
print("Mesclando ",alist)
alist = [54,26,93,17,77,31,44,55,20]
merge_sort(alist)
print(alist)
Quick sort
# Quick sort
def quick_sort(alist):
quick_sort_helper(alist,0,len(alist)-1)
def quick_sort_helper(alist,first,last):
if first<last:
splitpoint = partition(alist,first,last)
quick_sort_helper(alist,first,splitpoint-1)
quick_sort_helper(alist,splitpoint+1,last)
def partition(alist,first,last):
pivotvalue = alist[first]
leftmark = first+1
rightmark = last
done = False
while not done:
while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
leftmark = leftmark + 1
while alist[rightmark] >= pivotvalue and rightmark >= leftmark:
rightmark = rightmark -1
if rightmark < leftmark:
done = True
else:
temp = alist[leftmark]
alist[leftmark] = alist[rightmark]
alist[rightmark] = temp
temp = alist[first]
alist[first] = alist[rightmark]
alist[rightmark] = temp
return rightmark
alist = [54,26,93,17,77,31,44,55,20]
quick_sort(alist)
print(alist)
