Estrutura e Algoritmo (04): Regras de Classificação e Algoritmo de Pesquisa

Código-fonte deste artigo: GitHub · clique aqui || GitEE · clique aqui

Um, algoritmo recursivo

A recursão é um método que chama a si mesmo, passando variáveis ​​diferentes a cada vez que é chamado, o que pode tornar o código conciso. Algoritmo recursivo em ciência da computação refere-se a um método de resolução de problemas decompondo repetidamente os problemas em subproblemas semelhantes. Os métodos recursivos podem ser usados ​​para resolver muitos problemas de ciência da computação, por isso é muito importante na ciência da computação conceito.

Caso básico : impressão de dados recursivamente;

public class M01_Recursion {
    public static void main(String[] args) {
        printNum(3);
    }
    private static void printNum (int num){
        if (num > 1){
            printNum(num-1);
        }
        System.out.println("num="+num);
    }
}

Diagrama de recursão :

Estrutura e Algoritmo (04): Regras de Classificação e Algoritmo de Pesquisa

Com base nas características da estrutura da pilha, a chamada recursiva formará a estrutura acima.Quando todos os métodos recursivos forem colocados com sucesso na pilha, a ação da pilha será executada por sua vez e o resultado dos dados será impresso.

No desenvolvimento real, a recursão é frequentemente usada para abordar problemas de estrutura de árvore, algoritmos fatoriais, pesquisa de classificação e outros problemas matemáticos.

A condição do algoritmo recursivo deve estar constantemente perto da condição de saída, caso contrário, é fácil causar um loop infinito para causar uma exceção de estouro de memória.

Em segundo lugar, o algoritmo de classificação

O algoritmo de classificação é a operação de organizar um grupo de registros de dados em ordem crescente ou decrescente de acordo com uma estratégia de classificação específica; algoritmos de classificação comumente usados: classificação por bolha, classificação por seleção, classificação por inserção, classificação por colina, classificação por mesclagem, classificação rápida, cardinalidade Classificação, etc; seleção de algoritmo de classificação: diferentes serviços de classificação podem ser testados por vários algoritmos, com baixa complexidade e uso prioritário rápido e demorado.

1. Classificação de bolha

Ao comparar os valores dos elementos adjacentes na sequência de classificação, por sua vez, se a ordem inversa for encontrada, a troca é realizada, de modo que o elemento com o maior valor seja gradualmente movido da frente para trás. O nome do algoritmo é porque quanto menor o elemento irá flutuar lentamente na troca de classificação Uma das pontas da sequência é como as bolhas de dióxido de carbono em uma bebida carbonatada chegarão ao topo, daí o nome tipo bolha.

public class M02_Bubble {
    public static void main(String[] args) {
        int[] arr = {3,7,5,9,6};
        bubbleSort(arr);
        for (int num:arr){
            System.out.println(num);
        }
    }
    public static void bubbleSort(int[] arr) {
        // 声明临时变量
        int temp = 0;
        // 排序总趟数
        for (int i = 0; i < arr.length - 1; i++) {
            // 元素交换
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 位置交换
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

Ideia central :

O número de elementos na passagem de classificação é o número de vezes a ser processado em teoria; a troca de posição de cada elemento requer uma comparação completa e o loop externo é controlado. O loop interno troca as posições de elementos individuais.

2. Escolha a classificação

Princípio de seleção e classificação: O menor (ou maior) elemento é selecionado a partir dos elementos de dados a serem classificados pela primeira vez, armazenados no início da sequência e, em seguida, o menor (grande) elemento é encontrado nos elementos restantes não classificados. Em seguida, coloque-o no final da sequência classificada. E assim por diante, até que o número de todos os elementos de dados a serem classificados seja zero.

public class M03_Selection {
    public static void main(String[] args) {
        int[] arr = {30,70,50,90,60};
        selectionSort(arr);
    }
    public static void selectionSort (int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            int minData = arr[i];
            for (int j = i + 1; j < arr.length; j++) {
                // 假设最小值判断
                if (minData > arr[j]) {
                    // 交换小值
                    minData = arr[j];
                    // 重置 minIndex,递增
                    minIndex = j;
                }
            }
            // 最小值交换放在arr[0]位置
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i] = minData ;
            }
            System.out.println("第"+(i+1)+"轮排序:"+Arrays.toString(arr));
        }
    }
}

Resultado de saída :

第1轮排序:[30, 70, 50, 90, 60]
第2轮排序:[30, 50, 70, 90, 60]
第3轮排序:[30, 50, 60, 90, 70]
第4轮排序:[30, 50, 60, 70, 90]

3. Classificação de inserção

A ideia básica é inserir um registro em uma lista ordenada que foi ordenada. Cada vez que o primeiro elemento é retirado da lista não ordenada durante o processo de ordenação, ele é comparado com os elementos da lista ordenada, por sua vez, e é inserido na lista ordenada. A posição apropriada na sequência da mesa torna uma nova mesa ordenada. No processo de implementação, um loop de camada dupla é usado.O loop externo procura todos os elementos, exceto o primeiro elemento, e o loop interno procura a posição a ser inserida na lista ordenada antes do elemento atual e o move.

public class M04_Insert {
    public static void main(String[] args) {
        int[] arr = {10,40,90,20,80};
        insertSort(arr);
    }
    public static void insertSort (int[] arr) {
        int insertValue = 0;
        int insertIndex = 0;
        for (int i = 1; i < arr.length; i++) {
            // 待插入数的值和下标
            insertValue = arr[i];
            insertIndex = i - 1;
            // 写入位置
            while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            if (insertIndex + 1 != i) {
                arr[insertIndex + 1] = insertValue;
            }
            System.out.println("第" + i + "轮插入排序:"+Arrays.toString(arr));
        }
    }
}

Resultado de saída :

第1轮插入排序:[10, 40, 90, 20, 80]
第2轮插入排序:[10, 40, 90, 20, 80]
第3轮插入排序:[10, 20, 40, 90, 80]
第4轮插入排序:[10, 20, 40, 80, 90]

Três, algoritmo de busca

O algoritmo de pesquisa refere-se à localização de um elemento de informação específico em um grupo de elementos. Em aplicativos de computador, a pesquisa é uma operação básica comum, como a pesquisa da tabela de símbolos em um compilador; os algoritmos de pesquisa comumente usados ​​são: pesquisa sequencial, pesquisa binária, interpolação Encontre, Fibonacci Encontre.

1. Pesquise em ordem

A pesquisa sequencial é um algoritmo de pesquisa básico que percorre um conjunto de elementos de acordo com a sequência original da sequência e os compara com os elementos a serem pesquisados ​​um a um.

public class M05_OrderFind {
    public static void main(String[] args) {
        String[] arr = {"first","second","third"};
        System.out.println(seqSearch(arr,"second"));
    }
    public static int seqSearch(String[] arr, String value) {
        // 数组下标,-1代表没有
        int findIndex = -1 ;
        // 遍历并逐个对比
        for (int i = 0; i < arr.length; i++) {
            if(value.equals(arr[i])) {
                return i ;
            }
        }
        return findIndex ;
    }
}

2. Pesquisa binária

A pesquisa binária também é chamada de Pesquisa binária, que é um método de pesquisa eficiente. No entanto, a busca binária requer que a tabela linear adote uma estrutura de armazenamento sequencial e os elementos da tabela sejam organizados em ordem por palavras-chave.

public class M06_BinaryFind {
    public static void main(String[] args) {
        int arr[] = { 10, 20, 30, 40, 50 };
        int index = binarySearch (arr, 0, arr.length - 1, 40);
        System.out.println("index="+index);
    }
    public static int binarySearch(int[] arr, int leftIndex, int rightIndex, int findValue) {
        // leftIndex > rightIndex,没有查到
        if (leftIndex > rightIndex) {
            return -1;
        }
        int midIndex = (leftIndex + rightIndex) / 2;
        int midValue = arr[midIndex];
        // 向左递归
        if (findValue < midValue) {
            return binarySearch(arr, leftIndex, midIndex - 1, findValue);
        // 向右递归
        } else if (findValue > midValue) {
            return binarySearch(arr, midIndex + 1, rightIndex, findValue);
        // 直接找到
        } else {
            return midIndex;
        }
    }
}

Se os elementos a serem consultados não estiverem ordenados, você pode classificá-los primeiro e, em seguida, pesquisar com base no algoritmo de classificação no segundo módulo acima.

Quarto, o endereço do código-fonte

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Leitura recomendada: sistema de programação de acabamento

Número de série Nome do Projeto Endereço GitHub Endereço GitEE Recomendado
01 Java descreve padrões de design, algoritmos e estruturas de dados GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
02 Fundação Java, simultaneidade, orientado a objetos, desenvolvimento web GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆
03 Explicação detalhada do caso do componente básico do microsserviço SpringCloud GitHub · clique aqui GitEE · Clique aqui ☆☆☆
04 Caso abrangente de arquitetura de microsserviço SpringCloud GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
05 Introdução ao aplicativo básico do framework SpringBoot para avançado GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆
06 O framework SpringBoot integra e desenvolve middleware comum GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
07 Caso básico de gerenciamento de dados, distribuição, design de arquitetura GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
08 Série de Big Data, armazenamento, componentes, computação e outras estruturas GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆

Acho que você gosta

Origin blog.51cto.com/14439672/2536477
Recomendado
Clasificación