Proeto e Análse de Algortmos Aula 1: Algortmos de Ordenação Prof. Carlos de Salles Terças-feras, 8h20 às 11h10
Algortmos de Ordenação Insertsort Mergesort Heapsort Qucksort
Algortmos de Ordenação Dado um vetor v com N elementos, a ordenação consste em organzar todos esses N elementos em uma ordem (não-crescente, não-decrescente etc) Exemplo: v = {1, 9, 8, 5, 3, 7, 4} Depos de ordenado de forma não-decrescente, v fca: v = {1, 3, 4, 5, 7, 8, 9}
Insert Sort Outros nomes: Bubble sort Selecton sort Conste em posconar o menor ou o maor elemento em seu lugar correto N vezes consecutvas
Insert Sort for =1,N do end for =+1,N do end f v[]>v[] end v[],v[] then = v[],v[]
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 9 8 5 3 7 4
Insert Sort 1 8 9 5 3 7 4
Insert Sort 1 5 9 8 3 7 4
Insert Sort 1 3 9 8 5 7 4
Insert Sort 1 3 9 8 5 7 4
Insert Sort 1 3 9 8 5 7 4
Insert Sort 1 3 8 9 5 7 4
Insert Sort 1 3 5 9 8 7 4
Insert Sort 1 3 5 9 8 7 4
Insert Sort 1 3 4 9 8 7 5
Insert Sort 1 3 4 8 9 7 5
Insert Sort 1 3 4 7 9 8 5
Insert Sort 1 3 4 5 9 8 7
Insert Sort 1 3 4 5 8 9 7
Insert Sort 1 3 4 5 7 9 8
Insert Sort 1 3 4 5 7 8 9
Insert Sort 1 3 4 5 7 8 9 Número de operações: (N-1) + (N-2) + (N-3) + + 3 + 2 + 1 N*(N-1) 2
Insert Sort Idea: Se o vetor á estver ordenado em alguma nteração, sera nteressante detectar sso e parar o algortmo. Como detecto se um vetor está ordenado? ordenado = true for =1,N do f v[]>v[+1] then ordenado = false end end
Insert Sort (melhora) for =N,2,-1 do trocas = false for =1,-1 do f v[]>v[+1] then v[],v[+1] = v[ [+1],v[] trocas = true end end f not trocas then break end end
Insert Sort (melhora) 1 9 8 5 3 7 4
Insert Sort (melhora) 1 9 8 5 3 7 4
Insert Sort (melhora) 1 8 9 5 3 7 4
Insert Sort (melhora) 1 8 5 9 3 7 4
Insert Sort (melhora) 1 8 5 3 9 7 4
Insert Sort (melhora) 1 8 5 3 7 9 4
Insert Sort (melhora) 1 8 5 3 7 4 9
Insert Sort (melhora) 1 8 5 3 7 4 9
Insert Sort (melhora) 1 5 8 3 7 4 9
Insert Sort (melhora) 1 5 3 8 7 4 9
Insert Sort (melhora) 1 5 3 7 8 4 9
Insert Sort (melhora) 1 5 3 7 4 8 9
Insert Sort (melhora) 1 5 3 7 4 8 9
Insert Sort (melhora) 1 3 5 7 4 8 9
Insert Sort (melhora) 1 3 5 7 4 8 9
Insert Sort (melhora) 1 3 5 4 7 8 9
Insert Sort (melhora) 1 3 5 4 7 8 9
Insert Sort (melhora) 1 3 5 4 7 8 9
Insert Sort (melhora) 1 3 4 5 7 8 9
Insert Sort (melhora) 1 3 4 5 7 8 9
Insert Sort (melhora) 1 3 4 5 7 8 9
Mergesort Ordena ncalmente sub-vetores de tamanho 1 ou 2 e recursvamente dobra esse tamanho até ordenar o vetor total de tamanho N Basea-se no merge de dos vetores ordenados
Merge de dos vetores ordenados Dados dos vetores V1 e V2, á ordenados, o merge cra um outro vetor V ordenado com os elementos de V1 e V2 local,,k = 1,1,1 for k=1,#v1+#v2 do f >#v2 then v[k]=v1[] ]; =+1 else f >#v1 then v[k]= =v2[]; =+1 else f v1[]<=v2[] then v[k]=v1[]; =+1 else v[k]=v2[]; =+1 end end
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 V= 1 3 k
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 V= 1 3 5 k
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 V= 1 3 5 7 k
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7 8
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7 8 11
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7 8 11 13
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7 8 11 13 18
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7 8 11 13 18 20
Merge de dos vetores V1= 1 3 7 18 20 V2= 5 7 8 11 13 k V= 1 3 5 7 7 8 11 13 18 20
Mergesort 1 9 8 5 3 7 4
Mergesort 1 9 8 5 3 7 4 1 9 8 5 3 7 4
Mergesort 1 9 8 5 3 7 4 1 9 8 5 3 7 4 1 9 8 5
Mergesort 1 9 8 5 3 7 4 1 9 8 5 3 7 4 1 9 5 8
Mergesort 1 9 8 5 3 7 4 1 5 8 9 3 7 4
Mergesort 1 9 8 5 3 7 4 1 5 8 9 3 7 4
Mergesort 1 9 8 5 3 7 4 1 5 8 9 3 7 4 3 7 4
Mergesort 1 9 8 5 3 7 4 1 5 8 9 3 7 4 3 7 4
Mergesort 1 9 8 5 3 7 4 1 5 8 9 3 4 7
Mergesort 1 3 4 5 7 8 9
Mergesort - operações 1 9 8 5 3 7 4 1 9 8 5 1 9 8 5 3 7 4 3 7 4
Mergesort - operações 1 9 8 5 3 7 4 1 9 8 5 1 9 8 5 3 7 4 3 7 4 log 2 N níves N operações em cada nível Total de operações: N * log 2 N
Heapsort Ordenação baseada na estrutura de dados heap A heap é um vetor que pode ser vsto como uma árvore bnára completa Cada nó da árvore equvale a um valor no vetor
Prmtvas da Heap length(v) número de elementos no vetor V heap-sze(v) número de elementos da heap armazenados no vetor V
Vetor Heap prmtvas de árvore parent() return /2 left() return 2 rght() return 2+1
Heap comoo um vetor 1 9 8 5 3 7 4 1 9 8 5 3 7 4
Propredade da Heap Para cada nó que não sea a raz, então: V[ parent() ] >= V[] Exemplo: 9 5 8 1 3 7 4
Prmtva Heapfy Função para manter a propredade da heap functon heapfy(v, ) l = left() r = rght() f l<=heap-sze(v) and V[l] ]>V[] then largest = l else largest = end f r<=heap-sze(v) and V[r] ]>V[largest] then largest=r end f largest!= then V[], V[largest] = V[ [largest], V[] heapfy(v, largest) end end
Construndoo uma Heap Prmtva que constró uma heap a partr de um vetor de N elementos functon buld_heap(v) heap-sze(v) = length(v) -- #V for =length(v)/ /2,1,-1 do heapfy(v,) end end
Construndoo uma Heap 1 9 8 5 3 7 4 1 9 8 heapfy 5 3 7 4
Construndoo uma Heap 1 9 8 5 3 7 4 1 heapfy 9 8 5 3 7 4
Construndoo uma Heap 1 9 8 5 3 7 4 9 1 heapfy 8 5 3 7 4
Construndoo uma Heap 9 1 8 5 3 7 4 9 heapfy 1 8 5 3 7 4
Construndoo uma Heap 9 5 8 1 3 7 4 9 5 8 heapfy 1 3 7 4
Construndoo uma Heap 9 5 8 1 3 7 4 9 5 8 1 3 7 4
Heapsort functon heapsort(v) for =length(v),,2,-1 do V[1], V[] = V[], V[1] heap-sze(v V) = heap-sze(v)- 1 heapfy(v,1) end end
Heapsort 9 5 8 1 3 7 4 9 5 1 3 8 7 4
Heapsort 4 5 8 1 3 7 9 4 heapfy 5 1 3 8 7 9
Heapsort 8 5 4 1 3 7 9 8 5 1 3 4 7 9 heapfy
Heapsort 8 5 7 1 3 4 9 8 5 1 3 7 4 9 heapfy
Heapsort 8 5 7 1 3 4 9 8 5 7 1 3 4 9
Heapsort 4 5 7 1 3 8 9 4 heapfy 5 7 1 3 8 9
Heapsort 7 5 4 1 3 8 9 7 5 4 heapfy 1 3 8 9
Heapsort 7 5 4 1 3 8 9 7 5 1 3 4 8 9
Heapsort 3 5 4 1 7 8 9 3 heapfy 5 1 7 4 8 9
Heapsort 5 3 4 1 7 8 9 5 heapfy 3 4 1 7 8 9
Heapsort 5 3 4 1 7 8 9 5 3 4 1 7 8 9
Heapsort 1 3 4 5 7 8 9 1 heapfy 3 4 5 7 8 9
Heapsort 4 3 1 5 7 8 9 4 3 1 heapfy 5 7 8 9
Heapsort 4 3 1 5 7 8 9 3 4 1 5 7 8 9
Heapsort 1 3 4 5 7 8 9 3 5 7 1 heapfy 4 8 9
Heapsort 3 1 4 5 7 8 9 heapfy 1 3 4 5 7 8 9
Heapsort 3 1 4 5 7 8 9 1 3 4 5 7 8 9
Heapsort 1 3 4 5 7 8 9 3 5 7 1 heapfy 4 8 9
Heapsort 1 3 4 5 7 8 9 1 3 4 5 7 8 9
Operações do Heapsort 1 3 4 5 7 8 9 1 3 4 log 2 N 5 7 8 9 N-1 ( vara de 1 a N-1) (heapfy depende da altura da heap)
Operações do Heapsort 1 3 4 5 7 8 9 Total de operações: (N-1) * log 2 N 3 1 4 log 2 N 5 7 8 9 N-1 ( vara de 1 a N-1) (heapfy depende da altura da heap)
Qucksort Ordena o vetor partconando recursvamente A cada teração, localza a posção fnal de um elemento aleatóro (pvô) e subdvde o vetor em duas partes para pr rossegur a ordenação
Partção Localza a posção fnal do pvô (um elemento aleatóro do vetor) e dvde o vetor em duas partes, garantndo: Todos os elementos à esquerda do pvô são menores ou guas a ele Todos os elementos à dreta do pvô são maores que ele
Partção functon partton(v, left, rght) pvot = V[left] = left-1 = rght+1 whle true do repeat =-1 untl V[]<=pvot repeat =+1 unt tl V[]>=pvot f < then V[], V[] = V[], V[] else return end end end
Qucksort functon qucksort(v, left, rght) f left<rght then mddle = partton(v, left, rght) qucksort(v, left, mddle) qucksort(v, mddle+1, rght) end end
Qucksort - qucksort(1,7) 5 9 8 1 3 7 4 1 2 3 4 5 6 7
Qucksort - partton(1,7) 5 9 8 1 3 7 4
Qucksort - partton(1,7) 5 9 8 1 3 7 4 untl V[ []<=5?
Qucksort - partton(1,7) 5 9 8 1 3 7 4 untl V[] ]>=5?
Qucksort - partton(1,7) 4 9 8 1 3 7 5 V[], V[] = V[], V[]
Qucksort - partton(1,7) 4 9 8 1 3 7 5 untl V[ []<=5?
Qucksort - partton(1,7) 4 9 8 1 3 7 5 untl V[ []<=5?
Qucksort - partton(1,7) 4 9 8 1 3 7 5 untl V[ []>=5?
Qucksort - partton(1,7) 4 3 8 1 9 7 5 V[], V[] = V[], V[]
Qucksort - partton(1,7) 4 3 8 1 9 7 5 untl V[ []<=5?
Qucksort - partton(1,7) 4 3 8 1 9 7 5 untl V[ []>=5?
Qucksort - partton(1,7) 4 3 1 8 9 7 5 V[], V[] = V[], V[]
Qucksort - partton(1,7) 4 3 1 8 9 7 5 untl V[ []<=5?
Qucksort - partton(1,7) 4 3 1 8 9 7 5 untl V[ []>=5?
Qucksort - qucksort(1,7) 4 3 1 8 9 7 5 mddle 4 3 1 qucksort(1,3) 8 9 7 5 qucksort(4,7)
Qucksort - qucksort(1,3) 4 3 1 1 2 3
Qucksort - partton(1,3) 4 3 1
Qucksort - partton(1,3) 4 3 1 untl V[ []<=4?
Qucksort - partton(1,3) 4 3 1 untl V[ []>=4?
Qucksort - partton(1,3) 1 3 4 V[], V[] = V[], V[]
Qucksort - partton(1,3) 1 3 4 untl V[ []<=4?
Qucksort - partton(1,3) 1 3 4 untl V[ []>=4?
Qucksort - partton(1,3) 1 3 4 untl V[ []>=4?
Qucksort - partton(1,3) 1 3 4 mddle