aulas tsi32b - estrutura, pesquisa e ordenação de dados (tsi utfpr-toledo)

64
TSI - Tecnologia em Sistemas para Internet TSI - Tecnologia em Sistemas para Internet TSI32B – Estrutura, Pesquisa e Ordenação de Dados TSI32B – Estrutura, Pesquisa e Ordenação de Dados Prof. Me. Sidgley Camargo de Andrade Prof. Me. Sidgley Camargo de Andrade http://pessoal.utfpr.edu.br/sidgleyandrade

Upload: universidade-tecnologica-federal-do-parana

Post on 19-Jul-2015

119 views

Category:

Education


0 download

TRANSCRIPT

TSI - Tecnologia em Sistemas para InternetTSI - Tecnologia em Sistemas para Internet

TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados

Prof. Me. Sidgley Camargo de AndradeProf. Me. Sidgley Camargo de Andradehttp://pessoal.utfpr.edu.br/sidgleyandrade

TSI33A - Banco de Dados I 2/64

AtençãoAtenção

Este material é uma introdução aos conceitos, técnicas e recursos fundamentais para a Este material é uma introdução aos conceitos, técnicas e recursos fundamentais para a manipulação de cadeia de caracteres, pilhas, listas, filas, tabela hash e grafos, bem manipulação de cadeia de caracteres, pilhas, listas, filas, tabela hash e grafos, bem como a pesquisa e ordenação de dados.como a pesquisa e ordenação de dados.

Organização do material:Organização do material:Semana 01 Cadeia de Caracteres em Java Semana 07 Em desenvolvimentoSemana 02 Ordenação Interna – Parte I Semana 08 Em desenvolvimento

Semana 03 Ordenação Interna – Parte II (em desenvolvimento) Semana 09 Em desenvolvimento

Semana 04 Em desenvolvimento Semana 10 Em desenvolvimento

Semana 05 Em desenvolvimento Semana 11 Em desenvolvimento

Semana 06 Em desenvolvimentoSemana 12Semana 13 Em desenvolvimento

TSI33A – Banco de Dados 1TSI33A – Banco de Dados 1

Cadeia de Caracteres em JavaCadeia de Caracteres em Java

Prof. Me. Sidgley Camargo de Andrade

Semana 01

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

44//6464

1. 1. CharChar

● Um únicoúnico valor de caracter corresponde ao tipo primitivotipo primitivo char:

● Um char é um valor de 8 bits8 bits, que pode assumir valores entre 00 e 255255. Tabelas padronizadas estabelecem correspondências entre valores numéricos e símbolos gráficos (e.g. ASCII estendidaASCII estendida)

char ch = 'T';// Unicode for uppercase Greek omega character -> Ωchar uniChar = '\u03A9';// an array of charschar[] charArray = { 'T', 'S', 'I', '3', '2', 'B' };

char ch = 'T';// Unicode for uppercase Greek omega character -> Ωchar uniChar = '\u03A9';// an array of charschar[] charArray = { 'T', 'S', 'I', '3', '2', 'B' };

short i;System.out.print("Dec \tChar\n");for(i=32;i<255;i++) {

ch = (char) i;System.out.format("%d\t%c\n",i,ch);

}

short i;System.out.print("Dec \tChar\n");for(i=32;i<255;i++) {

ch = (char) i;System.out.format("%d\t%c\n",i,ch);

}

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

55//6464

char como Objetos como Objetos● Em orientação a objetos é possível usar um charchar como um objeto (e.g.

argumento de um método em que se espera um objeto do tipo charchar).

● Um objeto do tipo de caracteres contém um único campo, cujo tipo é charchar, e uma série de métodos de manipulaçãométodos de manipulação de caracteres.

● O compilador Javacompilador Java converte automaticamente para um objetoobjeto charchar quando um charchar primitivo primitivo for atribuído a um objeto (i.e. autoboxingautoboxing ou unboxingunboxing).

Character ch = new Character('t');Character ch = new Character('t');

Character ch = 't';Character ch = 't';

Atenção!Atenção!A classe A classe CharacterCharacter é imutável, uma vez criado o objeto não pode ser é imutável, uma vez criado o objeto não pode ser alterado.alterado.

Atenção!Atenção!A classe A classe CharacterCharacter é imutável, uma vez criado o objeto não pode ser é imutável, uma vez criado o objeto não pode ser alterado.alterado.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

66//6464

Métodos Métodos staticstatic da Classe da Classe Character● Determina se o valor do charchar é uma letraletra ou um dígitodígito

● Determina se o valor do charchar é uma letraletra ou dígitodígito

Character ch = 'a';

System.out.println(Character.isLetter(ch)); // true

System.out.println(Character.isDigit(ch)); // false

Character ch = 'a';

System.out.println(Character.isLetter(ch)); // true

System.out.println(Character.isDigit(ch)); // false

boolean isLetter(char ch);boolean isDigit(char ch);

boolean isLetter(char ch);boolean isDigit(char ch);

Método

Character ch = '%';

System.out.println(Character.isLetterOrDigit(ch)); // false

Character ch = '%';

System.out.println(Character.isLetterOrDigit(ch)); // false

boolean isLetterOrDigit(char ch);boolean isLetterOrDigit(char ch); Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

77//6464

Métodos Métodos staticstatic da Classe da Classe Character +● Determina se o valor do charchar é um espaço em brancoespaço em branco

● Determina se o valor do charchar é uma letra maiúsculamaiúscula ou minúsculaminúscula

Character ch = 'a';

System.out.println(Character.isUpperCase(ch)); // false

System.out.println(Character.isLowerCase(ch)); // true

Character ch = 'a';

System.out.println(Character.isUpperCase(ch)); // false

System.out.println(Character.isLowerCase(ch)); // true

boolean isUpperCase(char ch);boolean isLowerCase(char ch);

boolean isUpperCase(char ch);boolean isLowerCase(char ch);

Character ch = 'a';

System.out.println(Character.isWhitespace(ch)); // false

Character ch = 'a';

System.out.println(Character.isWhitespace(ch)); // false

boolean isWhitespace(char ch);boolean isWhitespace(char ch); Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

88//6464

Métodos Métodos staticstatic da Classe da Classe Character ++● Retorna a maiúsculamaiúscula ou minúsculaminúscula do valor charchar

Character ch = new Character('a');

ch = Character.toUpperCase(ch);System.out.println( ch ); // 'A'

ch = Character.toUpperCase(ch);System.out.println( ch ); // 'a'

Character ch = new Character('a');

ch = Character.toUpperCase(ch);System.out.println( ch ); // 'A'

ch = Character.toUpperCase(ch);System.out.println( ch ); // 'a'

char toUpperCase(char ch);char toLowerCase(char ch);

char toUpperCase(char ch);char toLowerCase(char ch);

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

99//6464

Métodos Métodos instanceinstance da Classe da Classe Character● Retorna um objetoobjeto StringString do objeto — StringString de charchar

● ComparaCompara dois objetos de charchar numericamente

String s = new String( ch.toString() );

System.out.println( ch ); // "a"

String s = new String( ch.toString() );

System.out.println( ch ); // "a"

toString(char ch);toString(char ch);

Character ch = new Character('a');

System.out.println( ch.compareTo('a') ); // 0 (igual) >0< (diferente)

Character ch = new Character('a');

System.out.println( ch.compareTo('a') ); // 0 (igual) >0< (diferente)

int CompareTo(char anotherCharacter);int CompareTo(char anotherCharacter);

Atenção!Atenção!A lista completa dos métodos está disponível no endereço A lista completa dos métodos está disponível no endereço http://docs.oracle.com/javase/8/docs/api/java/lang/Character.htmlhttp://docs.oracle.com/javase/8/docs/api/java/lang/Character.html

Atenção!Atenção!A lista completa dos métodos está disponível no endereço A lista completa dos métodos está disponível no endereço http://docs.oracle.com/javase/8/docs/api/java/lang/Character.htmlhttp://docs.oracle.com/javase/8/docs/api/java/lang/Character.html

Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1010//6464

2. Cadeia de Caracteres (2. Cadeia de Caracteres (StringString))● Cadeia de caracteres ou StringString é amplamente utilizada na

programação.

● É representada como um arrayarray de caracteres codificados seguindo uma tabela de código de caracteres (e.g. ASCII).

– No terminal do GNU-Linux exetue: man ascci

● Em Java, StringsStrings são objetosobjetos, portanto, possuem um conjunto de métodos de manipulaçãométodos de manipulação.

Atenção!Atenção!A classe A classe StringString é imutável, portanto, uma vez que é criado um objeto é imutável, portanto, uma vez que é criado um objeto StringString este não pode ser alterado. Desta forma, os métodos dessa este não pode ser alterado. Desta forma, os métodos dessa classe retornam sempre uma nova string que contém o resultado da classe retornam sempre uma nova string que contém o resultado da operação.operação.

Atenção!Atenção!A classe A classe StringString é imutável, portanto, uma vez que é criado um objeto é imutável, portanto, uma vez que é criado um objeto StringString este não pode ser alterado. Desta forma, os métodos dessa este não pode ser alterado. Desta forma, os métodos dessa classe retornam sempre uma nova string que contém o resultado da classe retornam sempre uma nova string que contém o resultado da operação.operação.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1111//6464

Criando Criando StringsStrings

● Como uma série de caracterescaracteres delimitados por aspas duplas (String String literalliteral)

● Como uma objeto (newnew + construtorconstrutor)

String disciplina = "TSI32B";System.out.println(disciplina);

String disciplina = "TSI32B";System.out.println(disciplina);

O O autoboxingautoboxing também é aplicada para também é aplicada para StringsStringsO O autoboxingautoboxing também é aplicada para também é aplicada para StringsStrings

char[] discArray = { 'T', 'S', 'I', '3', '2', 'B' };String discString = new String(discArray);System.out.println(discString);

char[] discArray = { 'T', 'S', 'I', '3', '2', 'B' };String discString = new String(discArray);System.out.println(discString);

String disciplina = new String("TSI32B");

System.out.println(disciplina);

String disciplina = new String("TSI32B");

System.out.println(disciplina);

OUOU

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1212//6464

Sequência de Sequência de SCAPESCAPE

● Um caracter precedido por uma barra invertida \\ é uma sequência de escape, e tem um significado especial para o compilador.

\t Insere um tab no texto\b Insere um backspace no texto\n Insere uma nova linha no texto\r Insere um retorno de carro no texto\f Insere uma formatação no texto\' Insere uma aspa simples no texto\" Insere uma aspa dupla no texto\\ Insere uma barra invertida no texto

System.out.println("Disciplina\t\"TSI32B\"");// Disciplina "TSI32B"

System.out.println("Disciplina\t\"TSI32B\"");// Disciplina "TSI32B"

String disciplina = "Disciplina\nTSI32B";System.out.println(disciplina);// Disciplina// TSI32B

String disciplina = "Disciplina\nTSI32B";System.out.println(disciplina);// Disciplina// TSI32B

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1313//6464

3. Conversão 3. Conversão String para númeropara número● Através do método estático valueOf(valueOf(str)) das subclasses de

números (ByteByte, IntegerInteger, DoubleDouble, FloatFloat, LongLong e ShortShort).

● Através do método estático parse<Tipo>(parse<Tipo>(str)) das subclasses de números.

byte vByte = Byte.valueOf(str).byteValue();int vInt = Integer.valueOf(str).intValue();double vFloat = Float.valueOf(str).floatValue();double vDouble = Double.valueOf(str).doubleValue();long vLong = Long.valueOf(str).longValue();short vShort = Short.valueOf(str).shortValue();

byte vByte = Byte.valueOf(str).byteValue();int vInt = Integer.valueOf(str).intValue();double vFloat = Float.valueOf(str).floatValue();double vDouble = Double.valueOf(str).doubleValue();long vLong = Long.valueOf(str).longValue();short vShort = Short.valueOf(str).shortValue();

byte vByte = Byte.parseByte(str);int vInt = Integer.parseInt(str);double vFloat = Float.parseFloat(str);double vDouble = Double.parseDouble(str);long vLong = Long.parseLong(str);short vShort = Short.parseShort(str);

byte vByte = Byte.parseByte(str);int vInt = Integer.parseInt(str);double vFloat = Float.parseFloat(str);double vDouble = Double.parseDouble(str);long vLong = Long.parseLong(str);short vShort = Short.parseShort(str);

OUOU

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1414//6464

4. Conversão número para 4. Conversão número para String● Através do método estático toString(toString(num)) das subclasses de números.

● Através da concatenação com uma string vazia (casting forçadocasting forçado)

● Através do método estático valueOf(valueOf(num))

str = Byte.toString(vByte);str = Integer.toString(vInt);str = Float.toString(vFloat);str = Double.toString(vDouble);str = Long.toString(vLong);str = Short.toString(vShort);

str = Byte.toString(vByte);str = Integer.toString(vInt);str = Float.toString(vFloat);str = Double.toString(vDouble);str = Long.toString(vLong);str = Short.toString(vShort);

String str = "" + vByte;String str = "" + vInt;String str = "" + vFloat;

String str = "" + vByte;String str = "" + vInt;String str = "" + vFloat;

OUOU

OUOU

String str = String.valueOf(vByte);String str = String.valueOf(vInt);String str = String.valueOf(vFloat);

String str = String.valueOf(vByte);String str = String.valueOf(vInt);String str = String.valueOf(vFloat);

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1515//6464

5. Manipulando 5. Manipulando Strings● A classe StringString possui um conjunto de métodos para

– examinar o conteúdoexaminar o conteúdo de strings,

– encontrar caracteres ou substringsencontrar caracteres ou substrings dentro de uma String,

– entre outras operaçõesoutras operações necessária no dia a dia do desenvolver Java.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1616//6464

Coletando um Coletando um CaracterCaracter

String anotherPalindrome = "Niagara. O roar again!"; char aChar = anotherPalindrome.charAt(9);

String anotherPalindrome = "Niagara. O roar again!"; char aChar = anotherPalindrome.charAt(9);

Qual caracter será exibido com Qual caracter será exibido com a execução do comando a execução do comando System.out.print(aChar)System.out.print(aChar)??

Qual caracter será exibido com a execução do comando Qual caracter será exibido com a execução do comando System.out.print(System.out.print(anotherPalindrome.charAt(anotherPalindrome.length()/2)))??

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1717//6464

Coletando uma Coletando uma SubstringSubstring

String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(11, 15);

String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(11, 15);

String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(11);

String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(11);

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1818//6464

Outros Exemplos de ManipulaçãoOutros Exemplos de Manipulação● Retorna uma StringString removendoremovendo da esquerda e direita os espaços em

branco

● Retorna uma SStringtring convertida para minúsculaminúscula

String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(10, 15).trim();

String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(10, 15).trim();

String palindrome = "Niagara. O roar again!"; palindrome = palindrome.toLowerCase();

String palindrome = "Niagara. O roar again!"; palindrome = palindrome.toLowerCase();

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

1919//6464

Documentação da Classe Documentação da Classe String

Atenção!Atenção!A lista completa dos métodos está disponível no endereço A lista completa dos métodos está disponível no endereço http://docs.oracle.com/javase/8/docs/api/java/lang/String.htmlhttp://docs.oracle.com/javase/8/docs/api/java/lang/String.html

Atenção!Atenção!A lista completa dos métodos está disponível no endereço A lista completa dos métodos está disponível no endereço http://docs.oracle.com/javase/8/docs/api/java/lang/String.htmlhttp://docs.oracle.com/javase/8/docs/api/java/lang/String.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2020//6464

Métodos Métodos instanceinstance da Classe da Classe String● ComparaCompara duas stringsstrings de forma lexicográfica

● ComparaCompara dois objetos de stringsstrings

String str = new String("TSI32B");System.out.println(str.compareTo("tsi32b")); // != 0 (diferente)System.out.println(str.compareToIgnoreCase("tsi32b")); // 0 (igual)

String str = new String("TSI32B");System.out.println(str.compareTo("tsi32b")); // != 0 (diferente)System.out.println(str.compareToIgnoreCase("tsi32b")); // 0 (igual)

int compareTo(String anotherString);int compareToIgnoreCase(String anotherString);

int compareTo(String anotherString);int compareToIgnoreCase(String anotherString);

String str = new String("TSI32B");System.out.println(str.equals("tsi32b")); // falseSystem.out.println(str.equalsIgnoreCase("tsi32b")); // true

String str = new String("TSI32B");System.out.println(str.equals("tsi32b")); // falseSystem.out.println(str.equalsIgnoreCase("tsi32b")); // true

boolean equals(String anotherString);boolean equalsIgnoreCase(String anotherString);

boolean equals(String anotherString);boolean equalsIgnoreCase(String anotherString);

Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2121//6464

Métodos Métodos instanceinstance da Classe da Classe String +● Retorna o valor do caractere de uma posiçãoposição específica da stringstring

● Retorna a posiçãoposição específica de um caracter ou substringsubstring dentro da stringstring

String str = new String("TSI32B");System.out.print(str.charAt(0)); // 'T'

System.out.print(str.charAt(6)); // String index out of range: 6

String str = new String("TSI32B");System.out.print(str.charAt(0)); // 'T'

System.out.print(str.charAt(6)); // String index out of range: 6

char charAt(int index);char charAt(int index);

String str = new String("TSI32B");System.out.print(str.indexOf("S")); // 1System.out.print(str.indexOf("SB")); // -1 (não encontrou)

String str = new String("TSI32B");System.out.print(str.indexOf("S")); // 1System.out.print(str.indexOf("SB")); // -1 (não encontrou)

int indexOf(String str); (primeira ocorrência)int lastIndexOf(String str); (última ocorrência)

int indexOf(String str); (primeira ocorrência)int lastIndexOf(String str); (última ocorrência)

Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2222//6464

Métodos Métodos instanceinstance da Classe da Classe String ++● Testa se a string termina com um sufixo específico

● Retorna truetrue se length()length() é 0

String str = new String("TSI32B");System.out.print(str.endsWith("32b")); // false

String str = new String("TSI32B");System.out.print(str.endsWith("32b")); // false

boolean endsWith(String suffix);boolean endsWith(String suffix);

String str = new String();System.out.print(str.isEmpty()); // true

str = "TSI32B";System.out.print(str.isEmpty()); // false

String str = new String();System.out.print(str.isEmpty()); // true

str = "TSI32B";System.out.print(str.isEmpty()); // false

booean isEmpty();booean isEmpty();

Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2323//6464

Métodos Métodos instanceinstance da Classe da Classe String +++● Retorna o tamanhotamanho da stringstring

● ConcatenaConcatena a str2str2 ao final da str1str1

String str = "TSI32B";System.out.print(str.length()); // 6

String str = "TSI32B";System.out.print(str.length()); // 6

int length();int length();

String str1 = new String("TSI");String str2 = new String("32B");str1 = str1.concat(str2);System.out.print(str1); // "TSI32B"

String str1 = new String("TSI");String str2 = new String("32B");str1 = str1.concat(str2);System.out.print(str1); // "TSI32B"

String concat(String str);String concat(String str);

Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2424//6464

Métodos Métodos instanceinstance da Classe da Classe String ++++● Retorna um valor lógico se a String contêm a sequência de

caracteres

● Substitui cada caracter ou substringsubstring e retorna uma nova String

String str = "TSI32B";System.out.print(str.contains("I32"));

String str = "TSI32B";System.out.print(str.contains("I32"));

boolean contains(CharSequence s);boolean contains(CharSequence s);

String str = "TSI31A";str = str.replace("31A", "32B");System.out.print(str);

String str = "TSI31A";str = str.replace("31A", "32B");System.out.print(str);

String replace(char oldChar, char newChar);String replace(CharSequence target, CharSequence replacement);

String replace(char oldChar, char newChar);String replace(CharSequence target, CharSequence replacement);

Método

Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2525//6464

Segmentando o Segmentando o PathPath de um Arquivo de um Arquivofinal static String fullPath = "/home/user/index.html";static String pathSeparator = "/",

extensionSeparator = ".";

public static String extension() { int dot = fullPath.lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); }

public static String filename() { int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); }

public static String path() { int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(0, sep); }

public static void main(String[] args) { System.out.println("Extension = " + extension()); System.out.println("Filename = " + filename()); System.out.println("Path = " + path()); }

Saída do Programa

Extension = htmlFilename = indexPath = /home/user

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2626//6464

6. A Classe 6. A Classe StringBuilderStringBuilder

● A classe StringBuilderStringBuilder possui o mesmo propósito da classe String, contudo, proporciona maior performanceperformance na manipulação de grandes cadeiasgrandes cadeias de caracteres.

● Internamente, os objetos dessa classe são tratados como um array de array de comprimento variávelcomprimento variável.

Atenção!Atenção!A classe A classe StringBuilderStringBuilder é é mutávelmutável, portanto, uma vez que é criado , portanto, uma vez que é criado um objeto um objeto StringBuilderStringBuilder este pode ser alterado. Desta forma, os este pode ser alterado. Desta forma, os métodos dessa classe não forçam a criação de uma nova métodos dessa classe não forçam a criação de uma nova StringString..

Atenção!Atenção!A classe A classe StringBuilderStringBuilder é é mutávelmutável, portanto, uma vez que é criado , portanto, uma vez que é criado um objeto um objeto StringBuilderStringBuilder este pode ser alterado. Desta forma, os este pode ser alterado. Desta forma, os métodos dessa classe não forçam a criação de uma nova métodos dessa classe não forçam a criação de uma nova StringString..

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2727//6464

Criação e Capacidade de objetos Criação e Capacidade de objetos StringBuilderStringBuilder

● CriandoCriando um objeto StringBuilder

● CapacidadeCapacidade de um objeto StringBuilder

StringBuilder sb = new StringBuilder();StringBuilder sb = new StringBuilder();

OUOU

StringBuilder sb = new StringBuilder("Greetings");StringBuilder sb = new StringBuilder("Greetings");

System.out.print( sb.capacity() );System.out.print( sb.capacity() );

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2828//6464

Inserir valores de objetos Inserir valores de objetos StringBuilderStringBuilder

● Métodos para inseririnserir valores no objeto StringBuilder

StringBuilder sb = new StringBuilder();sb.append("TSI");sb.append(32);sb.append('B'); System.out.print(sb); // TSI32B

StringBuilder sb = new StringBuilder();sb.append("TSI");sb.append(32);sb.append('B'); System.out.print(sb); // TSI32B

StringBuilder append(Object obj); // ou tipos primitivosStringBuilder append(Object obj); // ou tipos primitivos Método

StringBuilder sb = new StringBuilder(); sb.insert(0,32);sb.insert(0,"TSI");sb.insert(5,'B'); System.out.print(sb); // TSI32B

StringBuilder sb = new StringBuilder(); sb.insert(0,32);sb.insert(0,"TSI");sb.insert(5,'B'); System.out.print(sb); // TSI32B

StringBuilder insert(int offset, Object obj);StringBuilder insert(int offset, Object obj); Método

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

2929//6464

Remover valores de objetos Remover valores de objetos StringBuilderStringBuilder

● Método para removerremover valores do objeto StringBuilder

StringBuilder sb = new StringBuilder("TSI32B"); sb.delete(0,3);sb.deleteCharAt(2); System.out.print(sb); // 32

StringBuilder sb = new StringBuilder("TSI32B"); sb.delete(0,3);sb.deleteCharAt(2); System.out.print(sb); // 32

StringBuilder delete(int start, int end);StringBuilder deleteCharAt(int index);

StringBuilder delete(int start, int end);StringBuilder deleteCharAt(int index);

Método

Atenção!Atenção!A lista completa dos métodos está disponível no endereço A lista completa dos métodos está disponível no endereço http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.htmlhttp://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html

Atenção!Atenção!A lista completa dos métodos está disponível no endereço A lista completa dos métodos está disponível no endereço http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.htmlhttp://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3030//6464

Trabalhando com Trabalhando com StringString e e StringBuilderStringBuilder

● As classes StringString e StringBuilderStringBuilder possuem o propósito de manipulação de Strings, contudo, não possuem os mesmos métodos (e.g. reverse())

● Considere a criação do objeto abaixo. Como você reverteriareverteria a palavra "B23SIT" na ordem inversa com a classe String?

● Com a conversão do objeto s para a classe StringBuilderStringBuilder pode-se aplicar o métido reversereverse()

String s = new String("B23IST");String s = new String("B23IST");

StringBuilder sb = new StringBuilder(s);sb.reverse(); System.out.print(sb); // TSI32B

StringBuilder sb = new StringBuilder(s);sb.reverse(); System.out.print(sb); // TSI32B

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3131//6464

ExercíciosExercícios

● Acesse o endereço abaixo e responsa as questões:

http://docs.oracle.com/javase/tutorial/java/data/QandE/characters-questions.html

● Em seguida confira o resultado das questões com o gabarito no endereço http://docs.oracle.com/javase/tutorial/java/data/QandE/characters-answers.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3232//6464

CréditosCréditos● MaterialMaterial

– The Java™ Tutorials. 2011. Disponível em: http://docs.oracle.com/javase/tutorial/java/index.html. Acessado em: 02 jan. 2015.

Trail: Learning the Java Language Lesson: Numbers and Strings→

– Aulas preparadas e disponibilizadas em 2014-1 pelo professor Lucas Antiqueira (TSI32B 2014-2).

TSI33A – Banco de Dados 1TSI33A – Banco de Dados 1

Ordenação Interna – Parte IOrdenação Interna – Parte I

Prof. Me. Sidgley Camargo de Andrade

Semana 02

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3434//6464

1. Ordenação de Dados1. Ordenação de Dados● A ordenaçãoordenação de dados em um sistema computacional pode ser obtida

pela inserção ordenadainserção ordenada dos dados (A…Z, a…z, 0…9, etc.) ou aplicação aplicação de algoritmosde algoritmos que ordenam conjuntos de dados existentes.

● A ordem de inserçãoordem de inserção dos dados não é, ou não pode sernão pode ser, uma preocupação do usuário. Por isso, elementos desordenadosdesordenados são comuns em sistemas computacionais (e.g.e.g. os clientes são inseridos em uma base de dados de forma aleatório e não ordenada por nome).

● A partir das situações e dos problemas do mundo real, vários algoritmos de ordenaçãoalgoritmos de ordenação foram desenvolvidos, consistindo basicamente em realizar comparações sucessivas e trocar os elementos de posição.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3535//6464

Por que Ordenar?Por que Ordenar?● Alguns algoritmos exploram a ordenação dos dados para obter maior

eficiência (desempenho) em sua execução:

– Algoritmos de buscaAlgoritmos de busca

– Algoritmos para identificar e excluir dados duplicadosAlgoritmos para identificar e excluir dados duplicados

– Algoritmos de agrupamento e classificação de dadosAlgoritmos de agrupamento e classificação de dados

Como buscar a palavra “manager” de forma eficiente no dicionário?Como buscar a palavra “manager” de forma eficiente no dicionário?Como buscar a palavra “manager” de forma eficiente no dicionário?Como buscar a palavra “manager” de forma eficiente no dicionário?

Como identificar de forma rápida nomes repetidos em uma lista não ordenada?Como identificar de forma rápida nomes repetidos em uma lista não ordenada?Como identificar de forma rápida nomes repetidos em uma lista não ordenada?Como identificar de forma rápida nomes repetidos em uma lista não ordenada?

Como agrupar os alunos em faixas etárias?Como agrupar os alunos em faixas etárias?Como agrupar os alunos em faixas etárias?Como agrupar os alunos em faixas etárias?

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3636//6464

O que é O que é Ordenação InternaOrdenação Interna??● A ordenação internaordenação interna envolve dados que estão contidos em memória estão contidos em memória

internainterna do computador (memória principal), sendo a origem destes dados a própria memória interna ou memória externa (arquivos, fitas, etc.).

● Quando o conjunto de dadosconjunto de dados a ser ordenado é maior do que a memória maior do que a memória internainterna, então métodos de ordenação externaordenação externa devem ser aplicados (conteúdo da Semana 05Semana 05).

● Métodos de ordenação internaordenação interna

insertionSort()insertionSort() selectionSort()selectionSort() bubbleSort()bubbleSort()mergeSort()mergeSort() heapSort()heapSort() shellSort()shellSort()

radixSort()radixSort() quickSort()quickSort()etc…

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3737//6464

ConsideraçõesConsiderações● Por questões didáticas, os materiais sobre ordenação normalmente

trabalham com a ordenação de números,ordenação de números, contudo, os algoritmos deste material são ampliados para a ordenação de outros tipos primitivostipos primitivos e Strings.Strings.

– InteirosInteiros: {3, 0, 5, 2, 1, 4}

– ReaisReais: {0.3, 0.0, 0.5, 0.2, 0.1, 0.4}

– StringsStrings: {"Sidgley", "Alexandre", "Fabio", "Wesley", "Eduardo"}

Atenção!Atenção!Também é possível ordenar objetos a partir de seus atributos.Também é possível ordenar objetos a partir de seus atributos.Atenção!Atenção!Também é possível ordenar objetos a partir de seus atributos.Também é possível ordenar objetos a partir de seus atributos.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3838//6464

2. Classe 2. Classe MySortingClassMySortingClass

● Classe principal onde os métodos de ordenação e métodos auxiliares (swap()swap() , print()print() e isGreater() isGreater()) serão implementados.

class MySortingClass {// array de objetos (tipos primitivos ou Strings)private Object[] array = null;

// contrutor de classe para alimentar o arraypublic MySortingClass(Object[] array) {

this.array = array;}

// implementação dos métodos de ordenação e auxiliares}

class MySortingClass {// array de objetos (tipos primitivos ou Strings)private Object[] array = null;

// contrutor de classe para alimentar o arraypublic MySortingClass(Object[] array) {

this.array = array;}

// implementação dos métodos de ordenação e auxiliares}

Métodos de usuário (implementados pelo professor)

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

3939//6464

O Método O Método swap()swap()

● Como dito anteriormente, os algoritmos de ordenação se resumem em realizar uma série de comparaçõescomparações e trocastrocas. Portanto, um método de swap()swap() é especificado:

public void swap (int i, int j) {Object aux;aux = array[i];array[i] = array[j];array[j] = aux;

}

public void swap (int i, int j) {Object aux;aux = array[i];array[i] = array[j];array[j] = aux;

}

Função para trocar a posição dos valores dos índices.

ObjectObject é a superclasse. Podemos substituir pela calsse String ou pelos tipos primitivos.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4040//6464

O Método O Método isGreater()isGreater()

● Esse método identifica se o parâmetro value1value1 é maior do que o parâmetro value2value2. IsGreater()IsGreater() é necessário devido ao uso do mesmo algoritmo de ordenaçãoalgoritmo de ordenação para os tipos de dados especificados.

public boolean isGreater(Object value1, Object value2) { boolean flag = false;

if (value1 instanceof String) flag = value1.toString().

compareToIgnoreCase(value2.toString()) > 0 ? true : false; else if (value1 instanceof Integer) flag = Integer.valueOf(value1.toString()) >

Integer.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Float) flag = Float.valueOf(value1.toString()) >

Float.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Double) flag = Double.valueOf(value1.toString()) >

Double.valueOf(value2.toString()) ? true : false; return flag;}

public boolean isGreater(Object value1, Object value2) { boolean flag = false;

if (value1 instanceof String) flag = value1.toString().

compareToIgnoreCase(value2.toString()) > 0 ? true : false; else if (value1 instanceof Integer) flag = Integer.valueOf(value1.toString()) >

Integer.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Float) flag = Float.valueOf(value1.toString()) >

Float.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Double) flag = Double.valueOf(value1.toString()) >

Double.valueOf(value2.toString()) ? true : false; return flag;}

InstanceofInstanceof verifica a classe do objeto

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4141//6464

O Método O Método print()print()

● Outro método importante é a exibição dos elementos a serem ordenados ou dos elementos ordenados. Para isso, o método print()print() foi implementado:

public void print() {int i;for (i = 0; i < array.length; i++)

System.out.print(array[i] + " ");System.out.println();

}

public void print() {int i;for (i = 0; i < array.length; i++)

System.out.print(array[i] + " ");System.out.println();

}

Atenção!Atenção!arrayarray é um atributo privado da classe que detêm os métodos de ordenação, é um atributo privado da classe que detêm os métodos de ordenação, swap()swap(), , print()print() ee isGreater()isGreater(). Assim, se exibido os elementos antes da . Assim, se exibido os elementos antes da chamada do método de ordenação, então os elementos estarão desordenados.chamada do método de ordenação, então os elementos estarão desordenados.

Atenção!Atenção!arrayarray é um atributo privado da classe que detêm os métodos de ordenação, é um atributo privado da classe que detêm os métodos de ordenação, swap()swap(), , print()print() ee isGreater()isGreater(). Assim, se exibido os elementos antes da . Assim, se exibido os elementos antes da chamada do método de ordenação, então os elementos estarão desordenados.chamada do método de ordenação, então os elementos estarão desordenados.

http://www.ime.usp.br/~pf/algoritmos/aulas/ordena.html#insertion

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4242//6464

3. 3. Método Método Insertion SortInsertion Sort

Percorrer a sequência de elementos sequência de elementos (N-1)(N-1) vezes, de 1 a N, deslocando o elemento correspondente a iteração ii de modo que os elementos à esquerdaelementos à esquerda fiquem ordenados (elementos menores elementos menores para o iníciopara o início).

– A cada iteração o método compara o elemento com os seus predecessores (array[i] com array[i-1], array[i-2]…array[0]) e o insere na posição adequada.

Atenção!Atenção!Uma sequência com Uma sequência com NN elementos terá, após a 1ª iteração, um elemento elementos terá, após a 1ª iteração, um elemento ordenado e ordenado e N-1N-1 elementos para ordenar. Na 2ª iteração dois elementos elementos para ordenar. Na 2ª iteração dois elementos ordenados e ordenados e N-2N-2 para ordenar. Assim, sucessivamente, até a iteração para ordenar. Assim, sucessivamente, até a iteração N-1N-1, cujo , cujo número de elementos para ordenar é número de elementos para ordenar é N-(N-1)N-(N-1)

Atenção!Atenção!Uma sequência com Uma sequência com NN elementos terá, após a 1ª iteração, um elemento elementos terá, após a 1ª iteração, um elemento ordenado e ordenado e N-1N-1 elementos para ordenar. Na 2ª iteração dois elementos elementos para ordenar. Na 2ª iteração dois elementos ordenados e ordenados e N-2N-2 para ordenar. Assim, sucessivamente, até a iteração para ordenar. Assim, sucessivamente, até a iteração N-1N-1, cujo , cujo número de elementos para ordenar é número de elementos para ordenar é N-(N-1)N-(N-1)

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4343//6464

Exemplificação Exemplificação Insertion SortInsertion Sort

// 1ª iteração 0 até 0i=1 3 0 5 2 1 4 key=0 <[0] swap() true

_ 3 5 2 1 40 3 5 2 1 4

// 2ª iteração 1 até 0i=2 0 3 5 2 1 4 key=5 <[1], <[0] swap() false

0 3 5 2 1 4// 3ª iteração 2 até 0i=3 0 3 5 2 1 4 key=2 <[2], <[1], <[0] swap() true

0 3 _ 5 1 40 _ 3 5 1 40 2 3 5 1 4

// 4ª iteração 3 até 0i=4 0 2 3 5 1 4 key=2 <[3], <[2], <[1], <[0] swap() true

0 2 3 _ 5 40 2 _ 3 5 40 _ 2 3 5 40 1 2 3 5 4

// 5ª iteração 4 até 0i=5 0 1 2 3 5 4 key=2 <[4], <[3], <[2], <[1], <[0] swap() true

0 1 2 3 _ 50 1 2 3 4 5

// 1ª iteração 0 até 0i=1 3 0 5 2 1 4 key=0 <[0] swap() true

_ 3 5 2 1 40 3 5 2 1 4

// 2ª iteração 1 até 0i=2 0 3 5 2 1 4 key=5 <[1], <[0] swap() false

0 3 5 2 1 4// 3ª iteração 2 até 0i=3 0 3 5 2 1 4 key=2 <[2], <[1], <[0] swap() true

0 3 _ 5 1 40 _ 3 5 1 40 2 3 5 1 4

// 4ª iteração 3 até 0i=4 0 2 3 5 1 4 key=2 <[3], <[2], <[1], <[0] swap() true

0 2 3 _ 5 40 2 _ 3 5 40 _ 2 3 5 40 1 2 3 5 4

// 5ª iteração 4 até 0i=5 0 1 2 3 5 4 key=2 <[4], <[3], <[2], <[1], <[0] swap() true

0 1 2 3 _ 50 1 2 3 4 5

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4444//6464

Método Método insertionSort()insertionSort() em Java em Java

1. public void insertionSort() {2. int i, j; 3. Object key;4. 5. for (i = 1; i < array.length; i++) {6. key = array[i];7. j = i - 1;8. while ((j >= 0) && (!isGreater(key, array[j]))) {9. array[j+1] = array[j];10. j--;11. }12. array[j+1] = key;13. }14. }

1. public void insertionSort() {2. int i, j; 3. Object key;4. 5. for (i = 1; i < array.length; i++) {6. key = array[i];7. j = i - 1;8. while ((j >= 0) && (!isGreater(key, array[j]))) {9. array[j+1] = array[j];10. j--;11. }12. array[j+1] = key;13. }14. }

Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4545//6464

4. 4. Método Método Bubble SortBubble Sort

Percorrer a sequência de elementos sequência de elementos (N-1)(N-1) vezes, de 0 a (N-1), comparando e trocando o elemento correspondente a iteração ii com os elementos à direitaelementos à direita (elementos menores para o inícioelementos menores para o início).

– A cada iteração o método compara o elemento com seus sucessores (array[i] com array[i+1]) e o insere na posição adequada.

Atenção!Atenção!Uma sequência com Uma sequência com NN elementos terá, após a 1ª iteração, um elemento elementos terá, após a 1ª iteração, um elemento ordenado e ordenado e N-1N-1 elementos para ordenar. Na 2ª iteração dois elementos elementos para ordenar. Na 2ª iteração dois elementos ordenados e ordenados e N-2N-2 para ordenar. Assim, sucessivamente, até a iteração para ordenar. Assim, sucessivamente, até a iteração N-1N-1, cujo , cujo número de elementos para ordenar é número de elementos para ordenar é N-(N-1)N-(N-1)

Atenção!Atenção!Uma sequência com Uma sequência com NN elementos terá, após a 1ª iteração, um elemento elementos terá, após a 1ª iteração, um elemento ordenado e ordenado e N-1N-1 elementos para ordenar. Na 2ª iteração dois elementos elementos para ordenar. Na 2ª iteração dois elementos ordenados e ordenados e N-2N-2 para ordenar. Assim, sucessivamente, até a iteração para ordenar. Assim, sucessivamente, até a iteração N-1N-1, cujo , cujo número de elementos para ordenar é número de elementos para ordenar é N-(N-1)N-(N-1)

http://www.ime.usp.br/~pf/algoritmos/aulas/ordena.html#insertion

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4646//6464

Exemplificação Exemplificação Bubble SortBubble Sort

// 1ª iteração 0 até N-1i=5 3 0 5 2 1 4 array[0] – array[1] swap() true

0 3 5 2 1 4 array[1] – array[2] swap() false0 3 5 2 1 4 array[2] – array[3] swap() true0 3 2 5 1 4 array[3] – array[4] swap() true0 3 2 1 5 4 array[4] – array[5] swap() true0 3 2 1 4 5 // término da 1ª iteração

// 2ª iteração 0 até N-2i=4 0 3 2 1 4 5 array[0] – array[1] swap() false

0 3 2 1 4 5 array[1] – array[2] swap() true0 2 3 1 4 5 array[2] – array[3] swap() true0 2 1 3 4 5 array[3] – array[4] swap() false0 2 1 3 4 5 // término da 2ª iteração

// 3ª iteração 0 até N-3i=3 0 2 1 3 4 5 array[0] – array[1] swap() false

0 2 1 3 4 5 array[1] – array[2] swap() true0 1 2 3 4 5 array[2] – array[3] swap() false0 1 2 3 4 5 // término da 3ª iteração

// 4ª iteração 0 até N-4i=2 0 1 2 3 4 5 array[0] – array[1] swap() false

0 1 2 3 4 5 array[1] – array[2] swap() false0 1 2 3 4 5 // término da 4ª iteração

// 5ª iteração 0 até N-5 (interrompida pela variável swap – sem troca em i=2)i=1 0 1 2 3 4 5 array[0] – array[1] swap() false

0 1 2 3 4 5 // término da 5ª iteração

// 1ª iteração 0 até N-1i=5 3 0 5 2 1 4 array[0] – array[1] swap() true

0 3 5 2 1 4 array[1] – array[2] swap() false0 3 5 2 1 4 array[2] – array[3] swap() true0 3 2 5 1 4 array[3] – array[4] swap() true0 3 2 1 5 4 array[4] – array[5] swap() true0 3 2 1 4 5 // término da 1ª iteração

// 2ª iteração 0 até N-2i=4 0 3 2 1 4 5 array[0] – array[1] swap() false

0 3 2 1 4 5 array[1] – array[2] swap() true0 2 3 1 4 5 array[2] – array[3] swap() true0 2 1 3 4 5 array[3] – array[4] swap() false0 2 1 3 4 5 // término da 2ª iteração

// 3ª iteração 0 até N-3i=3 0 2 1 3 4 5 array[0] – array[1] swap() false

0 2 1 3 4 5 array[1] – array[2] swap() true0 1 2 3 4 5 array[2] – array[3] swap() false0 1 2 3 4 5 // término da 3ª iteração

// 4ª iteração 0 até N-4i=2 0 1 2 3 4 5 array[0] – array[1] swap() false

0 1 2 3 4 5 array[1] – array[2] swap() false0 1 2 3 4 5 // término da 4ª iteração

// 5ª iteração 0 até N-5 (interrompida pela variável swap – sem troca em i=2)i=1 0 1 2 3 4 5 array[0] – array[1] swap() false

0 1 2 3 4 5 // término da 5ª iteração

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4747//6464

Método Método bubbleSort()bubbleSort() em Java em Java

1. public void bubbleSort() {2. int i, j;3. boolean swap = true;4. 5. for (i = array.length - 1; (i > 0 && swap); i--) { 6. swap = false;7. for (j = 0; j < i; j++) { 8. if (isGreater(array[j], array[j+1])) {9. swap(j,j+1);10. swap = true;11. }12. } 13. } 14. }

1. public void bubbleSort() {2. int i, j;3. boolean swap = true;4. 5. for (i = array.length - 1; (i > 0 && swap); i--) { 6. swap = false;7. for (j = 0; j < i; j++) { 8. if (isGreater(array[j], array[j+1])) {9. swap(j,j+1);10. swap = true;11. }12. } 13. } 14. }

A variável swapswap interromper o processo quando houver uma passagem inteira sem trocas

Função swap() swap() apresentada para trocar a posição dos valores dos índices.

Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4848//6464

5. Método 5. Método Selection SortSelection Sort

Percorrer a sequência de elementos sequência de elementos (N-1)(N-1) vezes, de 0 a N-1, encontrando a cada iteração ii, sendo ii entre 0…(N-1)0…(N-1), o menor elemento. Em seguida, trocar o menor elemento pelo elemento do índice ii (elementos menores para o inícioelementos menores para o início).

– A cada iteração, encontrar o menor valor e trocá-lo pela posição do índice (minmin com array[i]array[i]).

Atenção!Atenção!Uma sequência com Uma sequência com NN elementos terá, após a 1ª iteração, um elemento elementos terá, após a 1ª iteração, um elemento ordenado e ordenado e N-1N-1 elementos para ordenar. Na 2ª iteração dois elementos elementos para ordenar. Na 2ª iteração dois elementos ordenados e ordenados e N-2N-2 para ordenar. Assim, sucessivamente, até a iteração para ordenar. Assim, sucessivamente, até a iteração N-1N-1, cujo , cujo número de elementos para ordenar é número de elementos para ordenar é N-(N-1)N-(N-1)

Atenção!Atenção!Uma sequência com Uma sequência com NN elementos terá, após a 1ª iteração, um elemento elementos terá, após a 1ª iteração, um elemento ordenado e ordenado e N-1N-1 elementos para ordenar. Na 2ª iteração dois elementos elementos para ordenar. Na 2ª iteração dois elementos ordenados e ordenados e N-2N-2 para ordenar. Assim, sucessivamente, até a iteração para ordenar. Assim, sucessivamente, até a iteração N-1N-1, cujo , cujo número de elementos para ordenar é número de elementos para ordenar é N-(N-1)N-(N-1)

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

4949//6464

Exemplificação Exemplificação Seletion SortSeletion Sort

// 1ª iteração 3 0 5 2 1 4 min=[0] troca com [1] swap() true

0 3 5 2 1 4// 2ª iteração

0 3 5 2 1 4 min=[1] troca com [4] swap() true0 1 5 2 3 4

// 3ª iteração0 1 5 2 3 4 min=[2] troca com [3] swap() true0 1 2 5 3 4

// 4ª iteração0 1 2 5 3 4 min=[3] troca com [4] swap() true0 1 2 3 5 4

// 5ª iteração0 1 2 3 5 4 min=[4] troca com [5] swap() true0 1 2 3 5 4

// 1ª iteração 3 0 5 2 1 4 min=[0] troca com [1] swap() true

0 3 5 2 1 4// 2ª iteração

0 3 5 2 1 4 min=[1] troca com [4] swap() true0 1 5 2 3 4

// 3ª iteração0 1 5 2 3 4 min=[2] troca com [3] swap() true0 1 2 5 3 4

// 4ª iteração0 1 2 5 3 4 min=[3] troca com [4] swap() true0 1 2 3 5 4

// 5ª iteração0 1 2 3 5 4 min=[4] troca com [5] swap() true0 1 2 3 5 4

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5050//6464

MétodoMétodo selectionSort() selectionSort() em Java em Java

1. public void selectionSort() {2. int i, j, min;3. 4. for (i = 0; i < array.length - 1; i++) {5. min = i;6. for (j = i + 1; j < array.length; j++) 7. if (!isGreater(array[j], array[min]))8. min = j;9. swap(min,i);10. }11. }

1. public void selectionSort() {2. int i, j, min;3. 4. for (i = 0; i < array.length - 1; i++) {5. min = i;6. for (j = i + 1; j < array.length; j++) 7. if (!isGreater(array[j], array[min]))8. min = j;9. swap(min,i);10. }11. }

Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5151//6464

6. Simuladores6. Simuladores

● http://www.cs.usfca.edu/~galles/visualization/

● http://www.sorting-algorithms.com/

● http://nicholasandre.com.br/sorting/

Atenção!Atenção!Analise a execução dos métodos apresentados para as diferentes Analise a execução dos métodos apresentados para as diferentes entradas (entradas (Random, , Nearly Sorted, , Reversed e e Few Unique))

Atenção!Atenção!Analise a execução dos métodos apresentados para as diferentes Analise a execução dos métodos apresentados para as diferentes entradas (entradas (Random, , Nearly Sorted, , Reversed e e Few Unique))

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5252//6464

CréditosCréditos● MaterialMaterial

– Preiss, B. R. Estrutura de Dados e Algoritmos: Padrões de Projetos Orientados a Objeto com Java. Rio de Janeiro: Elsevier, 2000. ISBN 978-85-7110-0693-7.

Capítulo 15: Algoritmos de Ordenação e Ordenadores

– Aulas preparadas e disponibilizadas em 2014-1 pelo professor Lucas Antiqueira (TSI32B 2014-2).

TSI33A – Banco de Dados 1TSI33A – Banco de Dados 1

Ordenação Interna – Parte IIOrdenação Interna – Parte II

Prof. Me. Sidgley Camargo de Andrade

Semana 03

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5454//6464

1. 1. Método Método Merge SortMerge Sort

A sequência de elementossequência de elementos é dividida recursivamente NN vezes até cada subsequênciasubsequência conter apenas um elemento. As subsenquênciassubsenquências são intercaladas formando uma sequência ordenadasequência ordenada de elementos (dividir para conquistardividir para conquistar).

dividirdividir

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5555//6464

Exemplificação Exemplificação Merge SortMerge Sort

3 0 5 2 1 4

3 0 5 2 1 4

3 0 5 2 1 4

3 0 5 2 1 4

0 3 5 2 1 4

0 3 5 2 1 4

0 3 5 1 2 4

0 1 2 3 4 5

3 0 5 2 1 4

3 0 5 2 1 4

3 0 5 2 1 4

3 0 5 2 1 4

0 3 5 2 1 4

0 3 5 2 1 4

0 3 5 1 2 4

0 1 2 3 4 5

DividirDividirmergeSortRecursive()

IntercalarIntercalardoMerge()

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5656//6464

O Método O Método isGreaterEquals()isGreaterEquals()

● Esse método identifica se o parâmetro value1value1 é maior ou igual do que o parâmetro value2value2.

public boolean isGreaterEquals(Object value1, Object value2) { boolean flag = false;

if (value1 instanceof String) flag = value1.toString().

compareToIgnoreCase(value2.toString()) >= 0 ? true : false; else if (value1 instanceof Integer) flag = Integer.valueOf(value1.toString()) >=

Integer.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Float) flag = Float.valueOf(value1.toString()) >=

Float.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Double) flag = Double.valueOf(value1.toString()) >=

Double.valueOf(value2.toString()) ? true : false; return flag;}

public boolean isGreaterEquals(Object value1, Object value2) { boolean flag = false;

if (value1 instanceof String) flag = value1.toString().

compareToIgnoreCase(value2.toString()) >= 0 ? true : false; else if (value1 instanceof Integer) flag = Integer.valueOf(value1.toString()) >=

Integer.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Float) flag = Float.valueOf(value1.toString()) >=

Float.valueOf(value2.toString()) ? true : false; else if (value1 instanceof Double) flag = Double.valueOf(value1.toString()) >=

Double.valueOf(value2.toString()) ? true : false; return flag;}

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5757//6464

Método Método mergeSort()mergeSort() em Java - em Java - DivisãoDivisão

1. public void mergeSort() { 2. mergeSortRecursive(0, array.length); 3. }

1. public void mergeSort() { 2. mergeSortRecursive(0, array.length); 3. }

1. private void mergeSortRecursive(int p, int r) { 2. int q; 3. if (p < r - 1) { 4. q = (p + r) / 2; 5. mergeSortRecursive(p, q); 6. mergeSortRecursive(q, r); 7. doMerge(p, q, r); 8. } 9. }

1. private void mergeSortRecursive(int p, int r) { 2. int q; 3. if (p < r - 1) { 4. q = (p + r) / 2; 5. mergeSortRecursive(p, q); 6. mergeSortRecursive(q, r); 7. doMerge(p, q, r); 8. } 9. }

Método público a ser invocado.

Método para realizar as divisões recursivas e invocar a intercalação das subcadeias de elementos.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5858//6464

Método Método mergeSort()mergeSort() em Java - em Java - IntercalaçãoIntercalação

1. private void doMerge(int p, int q, int r) { 2. int i = p, j = q, k = 0; 3. Object[] w = new Object[r-p]; 4. 5. while (i < q && j < r) { 6. if (!isGreaterEquals(array[i],array[j])) 7. w[k++] = array[i++]; 8. else 9. w[k++] = array[j++];10. }11.12. while (i < q)13. w[k++] = array[i++];14.15. while (j < r)16. w[k++] = array[j++];17.18. for (i = p; i < r; ++i)19. array[i] = w[i-p];20. }

1. private void doMerge(int p, int q, int r) { 2. int i = p, j = q, k = 0; 3. Object[] w = new Object[r-p]; 4. 5. while (i < q && j < r) { 6. if (!isGreaterEquals(array[i],array[j])) 7. w[k++] = array[i++]; 8. else 9. w[k++] = array[j++];10. }11.12. while (i < q)13. w[k++] = array[i++];14.15. while (j < r)16. w[k++] = array[j++];17.18. for (i = p; i < r; ++i)19. array[i] = w[i-p];20. }

Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html Atenção!Atenção!Simule o método em Simule o método em http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.htmlhttp://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

5959//6464

1. 1. Método Método Quick SortQuick Sort

A sequência de elementossequência de elementos é dividida recursivamente NN vezes através do particionamento dos elementos em duas subsequências desordenadas de modo que os elementos menores que um determinado pivo fiquem para a esquerda e os elementos maiores à direita. Depois da partição o pivo é inserido entre as duas sequências (dividir para conquistardividir para conquistar).

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

6060//6464

Método Método quickSort()quickSort() em Java em Java

1. public void quickSort() { 2. quickSortRecursive(0, array.length - 1); 3. }

1. public void quickSort() { 2. quickSortRecursive(0, array.length - 1); 3. }

Método público a ser invocado.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

6161//6464

Método Método quickSort()quickSort() em Java em Java 1. private void quickSortRecursive(int inf, int sup) { 2. int meio, i, j; 3. Object aux, pivo; 4. if (inf < sup) { 5. meio = (inf + sup) / 2; 6. pivo = array[meio]; 7. array[meio] = array[sup]; 8. array[sup] = pivo; 9. i = inf - 1;10. j = sup;11. do {12. do {13. i++;14. } while (isGreater(pivo, array[i]));15. do {16. j--;17. } while ((isGreater(array[j], pivo)) && (j > inf));18. if (i < j) {19. aux = array[i];20. array[i] = array[j];21. array[j] = aux;22. }23. } while (i < j);24. array[sup] = array[i];25. array[i] = pivo;26. quickSortRecursive(inf, i - 1);27. quickSortRecursive(i + 1, sup);28. }39. }

1. private void quickSortRecursive(int inf, int sup) { 2. int meio, i, j; 3. Object aux, pivo; 4. if (inf < sup) { 5. meio = (inf + sup) / 2; 6. pivo = array[meio]; 7. array[meio] = array[sup]; 8. array[sup] = pivo; 9. i = inf - 1;10. j = sup;11. do {12. do {13. i++;14. } while (isGreater(pivo, array[i]));15. do {16. j--;17. } while ((isGreater(array[j], pivo)) && (j > inf));18. if (i < j) {19. aux = array[i];20. array[i] = array[j];21. array[j] = aux;22. }23. } while (i < j);24. array[sup] = array[i];25. array[i] = pivo;26. quickSortRecursive(inf, i - 1);27. quickSortRecursive(i + 1, sup);28. }39. }

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

6262//6464

Considerações Considerações quickSort()quickSort()

● A seleção do pivotpivot afeta diretamente o tempo de processamento do algoritmo, portanto, cuidado com a escolha do pivotpivot.

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

6363//6464

6. Simuladores6. Simuladores

● http://www.cs.usfca.edu/~galles/visualization/

● http://www.sorting-algorithms.com/

● http://nicholasandre.com.br/sorting/

Atenção!Atenção!Analise a execução dos métodos apresentados para as diferentes Analise a execução dos métodos apresentados para as diferentes entradas (entradas (Random, , Nearly Sorted, , Reversed e e Few Unique))

Atenção!Atenção!Analise a execução dos métodos apresentados para as diferentes Analise a execução dos métodos apresentados para as diferentes entradas (entradas (Random, , Nearly Sorted, , Reversed e e Few Unique))

TSI32B - Estrutura, Pesquisa e OrdenaçãoTSI32B - Estrutura, Pesquisa e Ordenação de Dados de Dados

6464//6464

CréditosCréditos● MaterialMaterial

– Preiss, B. R. Estrutura de Dados e Algoritmos: Padrões de Projetos Orientados a Objeto com Java. Rio de Janeiro: Elsevier, 2000. ISBN 978-85-7110-0693-7.

Capítulo 15: Algoritmos de Ordenação e Ordenadores