Aps Ciencia Da Computacao 3º Periodo 2013
Aps Ciencia Da Computacao 3º Periodo 2013
Aps Ciencia Da Computacao 3º Periodo 2013
Universidade Paulista
Campus: Goinia - Flamboyant
Departamento de Computao
Curso: CINCIAS DA COMPUTAO
Relao de Alunos:
Las de Morais
R.A.: B41IAB-8
Lucas Aleixo Mendona
R.A.: B25444-0
Railton Brito Oliveira
R.A.: B47294-4
Rodrigo Marinho
R.A.: B233HC-0
DE
[1]
NDICE
Objetivo do Trabalho..................................................................................pg. 2
Introduo..................................................................................................pg. 3
Referencial Terico..............................................................................pg. 4 a 6
Desenvolvimento................................................................................pg. 7 a 21
Resultados e Discusso....................................................................pg. 20 a 27
Consideraes Finais................................................................................pg. 28
Referncias Bibliograficas.........................................................................pg. 29
Cdigo Fonte.....................................................................................pg. 30 a 41
[2]
OBJETIVO DO TRABALHO
[3]
INTRODUO
[4]
REFERENCIAL TERICO
[5]
valores de n, razoavelmente grande, o termo lg n quase
constante, de modo que o tempo de ordenao quase linear
com o nmero de itens a ordenar. Comparaes no pior caso: 2n
log2n + O(n) o mesmo que 2n lgn + O(n); Trocas no pior caso: n
log2n + O(n) o mesmo que n lgn + O(n); Melhor e pior caso: O(n
log2n) o mesmo que O(n lgn). O heapsort utiliza uma estrutura
de dados chamada heap, para ordenar os elementos a medida
que os insere na estrutura. Assim, ao final das inseres, os
elementos podem ser sucessivamente removidos da raiz da heap,
na ordem desejada, lembrando-se sempre de manter a
propriedade de max-heap. A heap pode ser representada como
uma rvore (uma rvore binria com propriedades especiais 2 ) ou
como um vetor. Para uma ordenao crescente, deve ser
construdo uma heap mnima (o menor elemento fica na raiz).
Para uma ordenao decrescente, deve ser construdo uma heap
mxima (o maior elemento fica na raiz).
O merge sort, ou ordenao por mistura, um exemplo de
algoritmo de ordenao do tipo dividir-para-conquistar. Sua ideia
bsica consiste em Dividir(o problema em vrios sub-problemas e
resolver esses sub-problemas atravs da recursividade) e
Conquistar(aps todos os sub-problemas terem sido resolvidos
ocorre a conquista que a unio das resolues dos subproblemas).Como o algoritmo do Merge Sort usa a recursividade
em alguns problemas esta tcnica no muito eficiente devido ao
alto consumo de memria e tempo de execuo. Nele, possvel
implementar o merge sort utilizando somente um vetor auxiliar ao
longo de toda a execuo, tornando assim a complexidade de
espao adicional igual a (n log n). possvel tambm
implementar o algoritmo com espao adicional (1), e foi criado
por Von Neumann em 1945. Os trs passos teis dos algoritmos
dividir-para-conquistar, ou divide and conquer, que se aplicam ao
merge sort so:
1. Dividir: Dividir os dados em subsequncias pequenas;
2. Conquistar: Classificar as duas metades recursivamente
aplicando o merge sort;
3. Combinar: Juntar as duas metades em um nico
conjunto j classificado.
[6]
[7]
O ALGORITMO DE ORDENAO
[8]
Tipos de Ordenao Simples:
Insertion Sort
Selection Sort
Bubble Sort
Comb Sort
Shell Sort
Quick Sort
Heap Sort
Merge Sort
[9]
Implementao Java:
package ordenacao;
public class InsertionSort {
public static void main(String[] args) {
[10]
}
}
Implementao Java:
package ordenacao;
[11]
int menor;
int a [] = {12,7,4,50,8,15,30,8,15,30,21,18,1};
[12]
Bubble Sort: Ou Ordenao por Flutuao o algoritmo simples que percorre
vrias vezes o vetor, de forma que a cada passagem o maior elemento da
sequncia flutua para o topo da mesma. Seu uso no recomendado para
sequncias com muitos elementos devido quantidade de passagens que
seriam necessrias para finalizar a ordenao.
Abaixo um exemplo de ordenao Bubble Sort
Implementao Java:
package ordenacao;
public class BubbleSort {
public static void main(String args[]){
int[] vet = {8, 9, 3, 5, 1};
int aux = 0;
int i = 0;
[13]
for(i = 0; i<5; i++){
for(int j = 0; j<4; j++){
if(vet[j] > vet[j + 1]){
aux = vet[j];
vet[j] = vet[j+1];
vet[j+1] = aux;
}
}
}
System.out.println("\n");
System.out.println("Vetor ordenado:");
for(i = 0; i<5; i++){
System.out.print(vet[i] + "\t");
}
}
}
[14]
Implementao Java:
package ordenacao;
import java.util.ArrayList;
swapped = false;
[15]
swap = sortMe.get(i);
sortMe.set(i, sortMe.get(i + gap));
sortMe.set(i + gap, swap);
swapped = true;
}
}
}
return sortMe;
}
[16]
Shell Sort: Criada como um refinamento do algoritmo de insero direta por
Donald Shell, esse mtodo divide o array em vrios segmentos e aplica a
insero direta a cada um deles, ou seja, o algoritmo passa vrias vezes pela
lista, dividindo o grupo maior em grupos menores, aplicando a insero direta a
cada um desses grupos menores. A figura abaixo ilustra o funcionamento do
algoritmo.
Implementao Java:
package ordenacao;
[17]
System.out.println("Vetor no ordenado: ");
for(i = 0; i<5; i++){
System.out.print(array[i] + "\t");
}
[18]
Quick Sort: o algoritmo de ordenao interna mais rpido de que se tem
conhecimento, alm de, provavelmente ser m mais utilizado. Elaborado por
C.A.R. Hoare em 1960, o Quick Sort utiliza uma tcnica de dividir o problema
inicial em dois subproblemas e resolver um problema menor utilizando a
recursividade. Entretanto, em alguns casos especiais, como na diviso de
parties desequilibradas, a ordenao pode ficar excepcionalmente lenta.
[19]
Implementao Java:
package ordenacao;
[20]
}
while (lo<hi && array[hi] > mid) {
hi--;
}
if (lo < hi) {
int T = array[lo];
array[lo] = array[hi];
array[hi] = T;
}
}
if (hi < lo) {
int T = hi;
hi = lo;
lo = T;
}
quick_srt(array, low, lo);
quick_srt(array, lo == low ? lo+1 : lo, n);
}
}
[21]
Heap Sort: Esse mtodo usa o mesmo principio do Select Sort, o Heap Sort
utiliza uma estrutura conhecida como Heap binrio para manter o prximo item
a ser selecionado.
Dos mtodos exemplificados acima, segue um quadro explicativo, sobre as
questes de complexidade e estabilidade de cada um:
Mtodo
Complexidade M(n)
Insertion Sort
Selection Sort
Bubble Sort
Comb Sort
Shell Sort
Quick Sort
Heap Sort
Merge Sort
(n-n)/2
Estabilidade
[22]
RESULTADOS E DISCUSSO
[23]
nome de ordenao pelo mtodo da bolha. Para melhor exemplificar o mtodo
bolha, segue abaixo um modelo de vetor que ser ordenado.
Aps a primeira etapa, o que se verifica que ocorreu uma pequena
mudana nas posies antes registradas. O Processo segue at os algarismos
estarem em ordem, o que pode levar um grande tempo quando se tratando de
muitos nmeros, fazendo assim, com que o bubble seja um dos mtodos mais
conhecidos, porem menos utilizados.
A estratgia consiste em reorganizar as chaves de modo que as chaves
"menores" antecedam as chaves "maiores". Em seguida o QuickSort ordena as
duas sublistas de chaves menores e maiores recursivamente at que a lista
completa se encontre ordenada. Os passos so: 1. Escolha um elemento da
lista, denominado piv; 2. Rearranje a lista de forma que todos os elementos
anteriores ao piv sejam menores que ele, e todos os elementos posteriores ao
piv sejam maiores que ele. Ao fim do processo o piv estar em sua posio
final e haver duas sublistas no ordenadas. Essa operao denominada
partio; 3. Recursivamente ordene a sublista dos elementos menores e a
sublista dos elementos maiores.
A base da recurso so as listas de tamanho zero ou um, que esto
sempre ordenadas. O processo finito, pois a cada iterao pelo menos um
elemento posto em sua posio final e no ser mais manipulado na iterao
seguinte.
Em cincia da computao, um algoritmo de ordenao um algoritmo
que coloca elementos de uma lista numa determinada ordem. As ordenaes
mais usadas so as numricas e as lexicogrficas. A ordenao eficiente
importante para otimizar o uso de outros algoritmos que necessitam de listas
ordenadas de alguma maneira para funcionarem corretamente. Devido ao
limitado uso de ordenao nos algoritmos utilizados, viu-se a necessidade de
estudar atentamente os algoritmos de ordenao Bubblesort e Quicksort.
Bubblesort um mtodo de ordenao de dados bem direto e simples,
utilizado amplamente no ensino de algoritmos de ordenao. O algoritmo
comea no incio do conjunto de dados, compara os dois primeiros elementos,
e se o primeiro maior que o segundo, troca as posies dos mesmos. Isso
continua para cada par de elementos adjacentes at o final do conjunto de
dados. Ento, comea novamente com os dois primeiros elementos, repetindo
[24]
at que nenhuma troca de posio tenha ocorrido na ltima passagem.
Enquanto que simples, o algoritmo extremamente ineficiente e raramente
usado, a no ser em educao.
J o Quicksort um algoritmo que segue o princpio de dividir para
conquistar, que tem por base operaes de particionamento: para particionar
uma lista, escolhe-se um elemento, chamado piv, movem-se todos os
elementos.
Atravs dos estudos bibliogrficos e de projeto desenvolvidos, foi
possvel analisar e validar satisfatoriamente algoritmos eficientes e seguros
para comutao automtica de ordenao. Foi notrio o fato de que algumas
tecnologias antes no previstas tiveram que ser adicionadas para estudo ao
longo do decorrer do projeto, ao passo que outras no foram to necessrias.
No obstante, todas tiveram crucial validade na pesquisa realizada.
Durante a realizao da pesquisa, pode-se notar que a anlise de mais
um tipo de abordagem bastante vlida, em termos de comparao de
performance, especialmente em se tratando de algoritmos. Alm disso, atravs
do estudo de caso feito com sucesso, onde se escreveu cerca de mil linhas de
cdigo em linguagem Java, ficou clara a enorme importncia dos diagramas
UML e de todo o processo de Engenharia de Software utilizado para a
concluso do projeto.
Ao final deste trabalho, tendo em vista os resultados obtidos, observouse que o cronograma definido na proposta da presente pesquisa foi
devidamente cumprido, o que possibilitou ao pesquisador efetuar, de forma
eficiente, a sua capacitao nas tecnologias envolvidas, bem como realizar um
estudo de caso vlido menor que o piv para antes dele e todos os maiores
para depois dele. Aps um particionamento, o algoritmo ordena recursivamente
as sublistas menores e maiores.
Implementaes eficientes do Quicksort so tipicamente ordenaes
instveis e de certa forma complexas, mas est entre os algoritmos de
ordenao mais rpidos na prtica, o que torna o Quicksort um dos algoritmos
de ordenao mais populares atualmente. O ponto mais complexo do Quicksort
reside na escolha de um bom elemento piv, constantemente escolhas erradas
de pivs podem resultar numa performance bastante lenta, no entanto, se a
[25]
cada passo da recurso do algoritmo, o elemento mediano escolhido como
piv, o algoritmo tem tima performance.
Aps comparao de eficincia, e devido ao destino no projeto do
algoritmo de comutao automtica, optou-se pela utilizao do Quicksort
como algoritmo de ordenao, sendo que o mesmo ser utilizado para o tipo
double.
A anlise deve ser feita sobre o nmero de comparaes, atribuies e
tempo de execuo dos algoritmos. Procure organizar inteligentemente os
dados coletados em tabelas, e tambm construa grficos a partir dos dados.
Ento, disserte sobre os dados nas tabelas e grficos. Grande parte da
avaliao ser realizada sobre a anlise dos resultados, ou seja, sobre o que
voc dissertar.
Neste trabalho, esto sendo disponibilizadas (no site da disciplina)
implementaes de algoritmos a serem utilizados para anlise da segunda
parte do trabalho.
A compilao, interpretao e uso deste cdigo constitui parte da
avaliao deste trabalho prtico. A implementao dos outros algoritmos a
serem utilizados na primeira parte fica por sua conta. Voc dever entender o
padro de programao do cdigo fornecido e implementar os novos
algoritmos seguindo esse padro.
Uma parte crucial do algoritmo a funo partio que tm que
rearranjar o vetor, dadas suas posies inicial e final, por meio da escolha de
um elemento piv, de tal forma que ao final os elementos menores que o piv
est a sua esquerda e os elementos maiores esto a sua direita.
Foram executados alguns testes para vetores de 10, 100, 1000, 10000 e
100000 elementos ordenados, quase ordenados, aleatrios e inversamente
ordenados.
Este trabalho possibilitou um aprofundamento sobre os algoritmos de
ordenao vistos em sala de aula bem como a anlise do nmero de
atribuies, comparaes e tempo de execuo de forma bem eficiente. Pelos
testes executados pde-se concluir que:
- Vale a pena inserir a verificao de ordenao (houve troca) no algoritmo
BubbleSort;
- No vale a pena usar o algoritmo InsertSort com elemento sentinela;
[26]
- Vale a pena inserir uma verificao (Min == i) para evitar a troca, no mtodo
SelectSort.
- O QuickSort o algoritmo mais eficiente para ordenar vetores de grandes
Dimenses.
- Vale a pena usar os algoritmos simples at vetores de 70 elementos, acima
desse valor deve-s usar os algoritmos eficientes.
As dificuldades encontradas foram devido ao fato haver vrias alteraes no
cdigo, implementao do InsertSort com cursores e de gerar os grficos com
eficincia.
As mesmas foram sanadas com o auxilio da bibliografia citada e a ajuda
do professor e monitores.
O conceito do nosso algoritmo e de como desenvolv-lo tratando do
assunto em aulas com natureza terica acompanhadas da aplicao prtica, de
forma paralela. Esta disciplina aborda o estudo da programao de
computadores dentro do paradigma procedural estruturado, envolvendo os
conceitos bsicos de lgica de programao, como conceitos de variveis,
tipos de dados, constantes, operadores aritmticos, expresses, atribuio,
estruturas de controle, modulao de algoritmos e noes de tipos compostos
de dados. Para atingir o objetivo de capacitar o aluno a construir programas
estruturados de dificuldade simples/ mediana, utiliza uma linguagem de
programao (Linguagem C/C++), com reconhecidas aplicaes desenvolvidas
tanto para o mercado de trabalho como para a rea cientfica.
considerada a tecnologia da cincia, auxilia a pesquisa desde o seu
planejamento at a interpretao dos dados, atravs da construo e anlise
de tabelas e grficos. Apresenta ao aluno uma tcnica de coleta e
apresentao de dados atravs das principais medidas de posio (mdia
aritmtica, moda e mediana) e de disperso (desvio padro e varincia).
Oferece
uma
ferramenta
estocsticos),
de
modelagem
de
(probabilidade
anlise
processos
indutiva
funo
de desenvolvimento
de sistemas
de informao tem
[27]
infraestrutura
de
tecnologia
da
informao (computadores
da informao e
estratgias, planejamento e
auxiliar na sua
prticas
da
incorporao s
de
desenvolvimento de
organizacionais
anlise
e apoio
deciso.
H mtodos,
interfaces
homem
gerenciamento de mudanas.
sistemas
tcnicas,
sistemas em
mquina, projetos
Os
comunicao,
scio
tcnicos e
de informao so difundidos
[28]
CONSIDERAES FINAIS
[29]
REFERNCIAS BIBLIOGRFICAS
http://www.flaviamissi.com.br/algoritmos-de-ordenacao-
[30]
CDIGO FONTE
package geoprocessamento;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
[31]
String sql = "select * from busca order by 1";
PreparedStatement stmt = conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
List<BuscaInformacao>
ArrayList<BuscaInformacao>();
buscaList
new
while (rs.next()) {
buscaList.add(new
rs.getString("dsbusca")));
}
rs.close();
stmt.close();
return buscaList;
}
}
BuscaBancoDados.java
package geoprocessamento;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
BuscaInformacao(rs.getInt("idbusca"),
[32]
private Connection connection;
private BuscaInformacao busca;
public BuscaInformacao
throws SQLException {
buscaArquivos(BuscaInformacao
arquivos)
PreparedStatement
stmt
=
(PreparedStatement)
this.connection.prepareStatement("SELECT * FROM contato WHERE nome
like ?%");
stmt.setString(1, BuscaInformacao.getNome());
ResultSet rs = (ResultSet) stmt.executeQuery();
while(rs.next()) {
BuscaInformacao.setNome(rs.getString("Nome"));
System.out.print(rs.getString("Nome"));
}
rs.close();
stmt.close();
connection.close();
return busca;
}
}
BuscaBinaria.java
package geoprocessamento;
import java.util.ArrayList;
[33]
import java.util.List;
}
}
[34]
}
BuscaInformacao.java
package geoprocessamento;
[35]
public static void main(String[] args) throws Exception {
ListaCampos list = null;
ArrayList<ListaCampos>
ArrayList<ListaCampos>();
Resultado
while(in.hasNext()) {
c = in.nextLine();
teste.add(c);
}
new
[36]
Resultado.add(list);
}
}
in.close();
file.close();
}
}
ConexaoMysql.java
package geoprocessamento;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
try {
Class.forName("com.mysql.jdbc.Driver");
return
PC/busca", "aps", "1234");
DriverManager.getConnection("jdbc:mysql://User-
[37]
throw new SQLException(e.getMessage());
}
}
}
FazerBusca.java
package geoprocessamento;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.Date;
import java.util.Timer;
[38]
System.out.print("Escolha Sua Opo:
Binria\n2: Busca DAO \n3: Busca Array List\n");
\n\n1:
Busca
Tipo
opcao = enter.nextLine().charAt(0);
Timer timer = new Timer();
Date data = new Date();
timer.schedule(new TempoCompilacao(), 1000, 1000);
switch (opcao) {
case 1:
List<BuscaBinaria.id>
ArrayList<BuscaBinaria.id>();
buscaLista
new
BufferedReader entrada;
entrada
InputStreamReader(System.in));
new
BufferedReader(new
int vetor[], i, z;
final int n;
try {
n = QuantidadedeID;
vetor = new int[ n ];
for(i = 0; i < vetor.length; i++ ){
System.out.print("Entre
com o ID a ser
pesquisado:\n");
vetor[i] = Integer.parseInt(entrada.readLine());
}
Arrays.sort(vetor);
System.out.print("\nDigite o nmero que voc quer
buscar:\n");
z = Integer.parseInt(entrada.readLine());
[39]
if(buscabinaria(vetor, z))
System.out.print("\nValor Encontrado\n");
else
System.out.print("\nValor No Encontrado\n");
}
catch (Exception e) {
System.out.println("Ocorreu
um
erro
durante
leitura!");
}
break;
case 2:
BuscaBancoDados = new BuscaBancoDados();
break;
case 3:
BuscaLista = new BuscaLista();
break;
[40]
ListaCampos.java
package geoprocessamento;
public ListaCampos(String id, String b1, String c1, int i, String texto) {
throw new UnsupportedOperationException("Sem suporte");
}
Resultado.java
package geoprocessamento;
[41]
TempoCompilacao.java
package geoprocessamento;
import java.util.TimerTask;