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 :
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 | ☆☆☆☆☆ |