Você está na página 1de 7

ENG.

INFORMÁTICA E DE
COMPUTADORES

Algoritmos e Estruturas de Dados


(parte 3 – Algoritmos de Ordenação Elementares - Merge Sort)

2º Semestre 2021/2022
Instituto Superior de Engenharia de Lisboa
Paula Graça

ISEL/AED 14/03/2022 1
MERGE SORT
• Solução: O Merge Sort é uma aplicação perfeita da técnica dividir para
conquistar
• Divide o problema particionando o array ao meio sucessivamente, criando
dois subarrays, um com a metade esquerda e outro com a metade direita, até
terem dimensão 1, não podendo ser mais particionado

• Conquista os sub-problemas ordenando recursivamente cada um dos


subarrays. Quando estes ficam com dimensão 1 (caso base), já estão ordenados
• Combina os resultados progredindo inversamente, juntando ambas as
metades (subarrays) ordenando os elementos entre si, até obter o array
original ordenado

ISEL/AED 14/03/2022 2
MERGE SORT

• É um algoritmo estável (stable), pois os valores repetidos mantêm as


mesmas posições relativas
• Utiliza espaço de armazenamento adicional para a ordenação (not in-place)

ISEL/AED 14/03/2022 3
MERGE SORT

fun mergeSort(table: DoubleArray, left: Int, right: Int) {


if (left < right) { dim tableLeft = (mid – left + 1) = 6 dim tableRight = (right – mid) = 6

val mid = (right + left)/ 2

0 1 2 3 4 5 6 7 8 9 10 11
val tableLeft = DoubleArray(mid - left + 1)
val tableRight = DoubleArray(right - mid) mid table = (left + right) / 2 = 5

//divide os elementos de table por tableLeft e tableRight


divide(table, tableLeft, tableRight, left, mid, right)

mergeSort(tableLeft, 0, mid) //repete para tableLeft


mergeSort(tableRight, 0, right - mid - 1) //repete para tableRight

// junta ambas as metades em table, ordenando-as


merge(table, tableLeft, tableRight, left, mid, right)
}
}
ISEL/AED 14/03/2022 4
MERGE SORT

fun divide(t: DoubleArray, tLeft: DoubleArray, tRight: DoubleArray, left: Int,


mid: Int, right: Int) {
for (i in left..mid) // copia para tLeft
tLeft[i] = t[i]
for (i in mid + 1..right)
tRight[i - mid - 1] = t[i] // copia para tRight
}

i = left .. mid i = mid+1 .. right

0 1 2 3 4 5 6 7 8 9 10 11

tLeft tRight

0 1 2 3 4 5 0 1 2 3 4 5

i i – mid - 1

ISEL/AED 14/03/2022 5
MERGE SORT

fun merge(t: DoubleArray, tLeft: DoubleArray, tRight: DoubleArray, left: Int,


mid: Int, right: Int) {
var i = 0
var j = 0
var k = left
// faz o merge ordenado de tLeft com tRight
while (i < tLeft.size && j < tRight.size)
if (tLeft[i] < tRight[j])
t[k++] = tLeft[i++]
else t[k++] = tRight[j++]
while (i < tLeft.size) // copia os restantes elementos de tLeft
t[k++] = tLeft[i++]
while (j < tRight.size) // copia os restantes elementos de tRight
t[k++] = tRight[j++]
}

ISEL/AED 14/03/2022 6
PROPRIEDADES DA ORDENAÇÃO

• Um algoritmo de ordenação é dito

• Adaptativo (adaptive) - se tira partido da ordem existente


dos dados para otimizar a ordenação
• Estável (stable) - se preserva a ordem relativa dos elementos
com chaves repetidas de acordo com o critério de
ordenação
• Interno (in-place) - se o conjunto de todos os dados a
ordenar cabe na memória utilizada para os armazenar

ISEL/AED 14/03/2022 7

Você também pode gostar