Introdução a algoritmos e estruturas de dados em Java
O estudo de algoritmos e estruturas de dados é a base sobre a qual se constrói a carreira de qualquer programador. Para desenvolvedores Java, entender como funcionam as principais estruturas de dados e algoritmos é criticamente importante: isso impacta diretamente o desempenho, a legibilidade do código e a capacidade de resolver problemas complexos. Neste artigo, vamos abordar os conceitos-chave em linguagem simples, com exemplos de código claros em Java.
Independentemente de você estar se preparando para uma entrevista ou apenas querendo escrever um código mais eficiente, este artigo será seu ponto de partida.
O que são estruturas de dados?
Estrutura de dados é uma forma de organizar e armazenar dados na memória do computador. A escolha correta da estrutura de dados pode acelerar um programa dezenas de vezes. Em Java, existem dois tipos de estruturas de dados: embutidas (arrays) e coleções (classes do Java Collections Framework).
Arrays (Array)
O array é a estrutura de dados mais simples e rápida. Ele armazena elementos do mesmo tipo em uma área contínua de memória. O acesso a um elemento por índice é instantâneo (O(1)), mas adicionar ou remover elementos requer a recriação do array.
public class ArrayExample { public static void main(String[] args) { // Declaração e inicialização do array int[] numbers = new int[5]; numbers[0] = 10; numbers[1] = 20; numbers[2] = 30; // Forma alternativa String[] fruits = {"Maçã", "Banana", "Laranja"}; // Percorrendo o array for (int i = 0; i < fruits.length; i++) { System.out.println(fruits[i]); } }}ArrayList — array dinâmico
O ArrayList resolve o principal problema do array comum — o tamanho fixo. Ele se expande automaticamente ao adicionar novos elementos. Esta é uma das estruturas de dados mais populares em Java.
import java.util.ArrayList;
public class ArrayListExample { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); // Adicionando elementos list.add("Java"); list.add("Python"); list.add("JavaScript"); // Obtendo elemento por índice System.out.println("Primeiro elemento: " + list.get(0)); // Removendo elemento list.remove("Python"); // Tamanho da lista System.out.println("Tamanho da lista: " + list.size()); }}Algoritmos básicos para iniciantes
Um algoritmo é uma sequência de passos para resolver um problema. Vamos abordar três algoritmos básicos que todo desenvolvedor Java deve conhecer.
Busca linear
O algoritmo de busca mais simples: verificamos sequencialmente cada elemento do array até encontrar o desejado.
public class LinearSearch { public static int findElement(int[] arr, int target) { for (int i = 0; i < arr.length; i++) { if (arr[i] == target) { return i; // Retorna o índice do elemento encontrado } } return -1; // Elemento não encontrado } public static void main(String[] args) { int[] data = {5, 3, 8, 1, 9, 2}; int index = findElement(data, 8); System.out.println("Índice do elemento 8: " + index); // Exibirá: 2 }}Busca binária
A busca binária funciona significativamente mais rápido que a busca linear, mas requer que o array esteja ordenado. O algoritmo divide o array ao meio a cada passo, descartando metade dos elementos.
import java.util.Arrays;
public class BinarySearch { public static int binarySearch(int[] arr, int target) { int left = 0; int right = arr.length - 1; while (left <= right) { int mid = l