Exercícios do Capítulo 8
bolha = function(v){
n = length(v)
for(j in 1:(n-1)){
for(i in 1:(n-j)){
if(v[i] > v[i+1]){
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
}
return(v)
}
vet = c(5,4,3,2,1)
bolha(vet)
## [1] 1 2 3 4 5
bolha_rec = function(v){
n = length(v)
if(n == 1) return(v)
for(i in 1:(n-1)){
if(v[i]>v[i+1]){
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
w = v[1:(n-1)]
wo = bolha_rec(w)
return(c(wo,v[n]))
}
bolha_rec(vet)
## [1] 1 2 3 4 5
bolha2 = function(v){
qtd = 0
n = length(v)
for(j in 1:(n-1)){
for(i in 1:(n-j)){
qtd = qtd + 1
if(v[i] > v[i+1]){
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
}
return(list(v,qtd))
}
vet = c(5,4,3,2,1)
bolha2(vet)
## [[1]]
## [1] 1 2 3 4 5
##
## [[2]]
## [1] 10
bolha_rec2 = function(v){
qtd = 0
n = length(v)
if(n == 1) return(list(v,qtd))
for(i in 1:(n-1)){
qtd = qtd + 1
if(v[i]>v[i+1]){
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
w = v[1:(n-1)]
wo = bolha_rec2(w)
return(list(c(wo[[1]],v[n]),qtd + wo[[2]]))
}
bolha_rec2(vet)
## [[1]]
## [1] 1 2 3 4 5
##
## [[2]]
## [1] 10
bolha3 = function(v){
qtd = 0
n = length(v)
for(j in 1:(n-1)){
for(i in 1:(n-j)){
if(v[i] > v[i+1]){
qtd = qtd + 1
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
}
return(list(v,qtd))
}
vet = c(5,4,3,2,1)
bolha3(vet)
## [[1]]
## [1] 1 2 3 4 5
##
## [[2]]
## [1] 10
bolha_rec3 = function(v){
qtd = 0
n = length(v)
if(n == 1) return(list(v,qtd))
for(i in 1:(n-1)){
if(v[i]>v[i+1]){
qtd = qtd + 1
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
w = v[1:(n-1)]
wo = bolha_rec3(w)
return(list(c(wo[[1]],v[n]),qtd + wo[[2]]))
}
bolha_rec3(vet)
## [[1]]
## [1] 1 2 3 4 5
##
## [[2]]
## [1] 10
bolha_rec_4 = function(v){
n = length(v)
if(n == 1) return(v)
for(i in 1:(n-1)){
if(v[i]>v[i+1]){
plot(v)
temp = v[i]
v[i] = v[i+1]
v[i+1] = temp
}
}
w = v[1:(n-1)]
wo = bolha_rec_4(w)
return(c(wo,v[n]))
}
v = c(5,4,3,2)
plot(bolha_rec_4(v))







# Os gráficos mostram como o algorítmo está ordenando os valores do vetor v.
# 1. Defina n = tamanho do vetor v;
# 2. Se n=1, retorne v;
# 3. Inicie i = 1;
# 4. Se v[i] < v[i+1], troque a posição i com posição i+1 no vetor v; (ATENÇÃO!)
# 5. Incremente: i = i + 1;
# 6. Se i <= n-1, volte para a linha 4;
# 7. Defina w = v[1:(n-1)];
# 8. Defina wo = OrdenaBolhaRec(w);
# 9. Retorne vo = (wo,v[n]).
bolha_desc_rec = function(v){
n = length(v)
if(n == 1) return(v)
for(i in 1:(n-1)){
if(v[i]<v[i+1]){
temp = v[i+1]
v[i+1] = v[i]
v[i] = temp
}
}
w = v[1:(n-1)]
wo = bolha_desc_rec(w)
return(c(wo,v[n]))
}
vet = c(1,5,4,3,2)
bolha_desc_rec(vet)
## [1] 5 4 3 2 1
quick_rec = function(v){
n = length(v)
if(n==1) return(v)
pivo = v[1]
i = 1
j = n
while(TRUE){
while(v[i] <= pivo && i < n){
i = i + 1
}
if(i == n && v[i] <= pivo){
v[1] = v[n]
v[n] = pivo
w=v[1:(n-1)]
wo = quick_rec(w)
return(c(wo,pivo))
}
while(v[j] > pivo){
j = j - 1
}
if(j == 1){
w=v[2:n]
wo = quick_rec(w)
return(c(pivo,wo))
}
if(j < i){
v[1] = v[j]
v[j] = pivo
we=v[1:(j-1)]
wd=v[(j+1):n]
weo = quick_rec(we)
wdo = quick_rec(wd)
return(c(weo,pivo,wdo))
}
aux = v[i]
v[i] = v[j]
v[j] = aux
}
}
vet = c(1,5,4,3,2)
quick_rec(vet)
## [1] 1 2 3 4 5
quick_rec2 = function(v){
n = length(v)
if(n==1) return(list(v,0))
qtd = 0
pivo = v[1]
i = 1
j = n
while(TRUE){
while(v[i] <= pivo && i < n){
i = i + 1
qtd = qtd + 1
}
qtd = qtd + 1
if(i == n && v[i] <= pivo){
v[1] = v[n]
v[n] = pivo
w=v[1:(n-1)]
wo = quick_rec2(w)
return(list(c(wo[[1]],pivo),qtd + wo[[2]]))
}
while(v[j] > pivo){
qtd = qtd + 1
j = j - 1
}
if(j == 1){
w=v[2:n]
wo = quick_rec2(w)
return(list(c(pivo,wo[[1]]),qtd + wo[[2]]))
}
qtd = qtd + 1
if(j < i){
v[1] = v[j]
v[j] = pivo
we=v[1:(j-1)]
wd=v[(j+1):n]
weo = quick_rec2(we)
wdo = quick_rec2(wd)
return(list(c(weo[[1]],pivo,wdo[[1]]),qtd + weo[[2]]+ wdo[[2]]))
}
aux = v[i]
v[i] = v[j]
v[j] = aux
}
}
vet = c(1,5,4,3,2)
quick_rec2(vet)
## [[1]]
## [1] 1 2 3 4 5
##
## [[2]]
## [1] 16
quick_rec3 = function(v){
n = length(v)
if(n==1) return(list(v,0))
qtd = 0
pivo = v[1]
i = 1
j = n
while(TRUE){
while(v[i] <= pivo && i < n){
i = i + 1
}
if(i == n && v[i] <= pivo){
qtd = qtd + 1
v[1] = v[n] #Troca
v[n] = pivo
w=v[1:(n-1)]
wo = quick_rec3(w)
return(list(c(wo[[1]],pivo),qtd + wo[[2]]))
}
while(v[j] > pivo){
j = j - 1
}
if(j == 1){
w=v[2:n]
wo = quick_rec3(w)
return(list(c(pivo,wo[[1]]),qtd + wo[[2]]))
}
if(j < i){
qtd = qtd + 1
v[1] = v[j] # Troca
v[j] = pivo
we=v[1:(j-1)]
wd=v[(j+1):n]
weo = quick_rec3(we)
wdo = quick_rec3(wd)
return(list(c(weo[[1]],pivo,wdo[[1]]),qtd + weo[[2]]+wdo[[2]]))
}
qtd = qtd + 1
aux = v[i] # Troca
v[i] = v[j]
v[j] = aux
}
}
vet = c(1,2,4,9,11,32,3)
quick_rec3(vet)
## [[1]]
## [1] 1 2 3 4 9 11 32
##
## [[2]]
## [1] 4
# 1. Defina n = tamanho do vetor v;
# 2. Se n=1, retorne v;
# 3. Defina pivo = v[1], i = 2 e j=n;
# 4. Se v[i] >= pivo e i < n, faça i = i + 1 e repete a linha 4;
# 5. Se i = n e v[i] >= pivo: troca o pivo com v[n]; defina w=v[1:(n-1)]; wo = OrdenaRapidoRec(w) e retorna c(wo,pivo).
# 6. Se v[j] < pivo, faça j = j - 1 e repete a linha 6.
# 7. Se j = 1: defina w=v[2:n]; wo = OrdenaRapidoRec(w) e retorna c(pivo,wo).
# 8. Se j < i: troca o v[j] com o pivo; defina we=v[1:(j-1)]; wd=v[j+1,n]; weo = OrdenaRapidoRec(we); wdo = OrdenaRapidoRec(wd); retorne c(weo,pivo,wdo).
# 9. Se i < j, troca o v[i] com o v[j] e volte para a linha 4;
quick_rec_desc = function(v){
n = length(v)
if(n==1) return(v)
pivo = v[1]
i = 1
j = n
while(TRUE){
while(v[i] >= pivo && i < n){ #Troquei
i = i + 1
}
if(i == n && v[i] >= pivo){ #Troquei
v[1] = v[n]
v[n] = pivo
w=v[1:(n-1)]
wo = quick_rec_desc(w)
return(c(wo,pivo))
}
while(v[j] < pivo){#Troquei
j = j - 1
}
if(j == 1){
w=v[2:n]
wo = quick_rec_desc(w)
return(c(pivo,wo))
}
if(j < i){
v[1] = v[j]
v[j] = pivo
we=v[1:(j-1)]
wd=v[(j+1):n]
weo = quick_rec_desc(we)
wdo = quick_rec_desc(wd)
return(c(weo,pivo,wdo))
}
aux = v[i]
v[i] = v[j]
v[j] = aux
}
}
vet2 = c(10,9,7,4,3,2,4,65,7,8,4,2,4,1)
quick_rec_desc(vet2)
## [1] 65 10 9 8 7 7 4 4 4 4 3 2 2 1
v<-c(1,3,5,5,4,0,-1,2,6,-2)
bolha_rec2(v) # Comparações para o método bolha
## [[1]]
## [1] -2 -1 0 1 2 3 4 5 5 6
##
## [[2]]
## [1] 45
bolha_rec3(v) # Trocas para o método bolha
## [[1]]
## [1] -2 -1 0 1 2 3 4 5 5 6
##
## [[2]]
## [1] 26
quick_rec2(v) # Comparações para o método rápido
## [[1]]
## [1] -2 -1 0 1 2 3 4 5 5 6
##
## [[2]]
## [1] 45
quick_rec3(v) # Trocas para o método rápido
## [[1]]
## [1] -2 -1 0 1 2 3 4 5 5 6
##
## [[2]]
## [1] 11
v<-c(10,9,8,7,6,5,4,3,2,1)
bolha_rec2(v) # Comparações para o método bolha
## [[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
##
## [[2]]
## [1] 45
bolha_rec3(v) # Trocas para o método bolha
## [[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
##
## [[2]]
## [1] 45
quick_rec2(v) # Comparações para o método rápido
## [[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
##
## [[2]]
## [1] 58
quick_rec3(v) # Trocas para o método rápido
## [[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
##
## [[2]]
## [1] 5
v<-c("fabio","ana","pedro","bruno","bruna","maria","clara","julia","vicente","daniel")
bolha_rec2(v) # Comparações para o método bolha
## [[1]]
## [1] "ana" "bruna" "bruno" "clara" "daniel" "fabio" "julia"
## [8] "maria" "pedro" "vicente"
##
## [[2]]
## [1] 45
bolha_rec3(v) # Trocas para o método bolha
## [[1]]
## [1] "ana" "bruna" "bruno" "clara" "daniel" "fabio" "julia"
## [8] "maria" "pedro" "vicente"
##
## [[2]]
## [1] 17
quick_rec2(v) # Comparações para o método rápido
## [[1]]
## [1] "ana" "bruna" "bruno" "clara" "daniel" "fabio" "julia"
## [8] "maria" "pedro" "vicente"
##
## [[2]]
## [1] 38
quick_rec3(v) # Trocas para o método rápido
## [[1]]
## [1] "ana" "bruna" "bruno" "clara" "daniel" "fabio" "julia"
## [8] "maria" "pedro" "vicente"
##
## [[2]]
## [1] 9