Estructura y algoritmo (04): reglas de ordenación y algoritmo de búsqueda

Código fuente de este artículo: GitHub · haga clic aquí || GitEE · haga clic aquí

Uno, algoritmo recursivo

La recursividad es un método que se llama a sí mismo, pasando diferentes variables cada vez que se llama, lo que puede hacer que el código sea conciso. El algoritmo recursivo en informática se refiere a un método para resolver problemas mediante la descomposición repetida de problemas en subproblemas similares.Los métodos recursivos se pueden utilizar para resolver muchos problemas de informática, por lo que es muy importante en informática. concepto.

Caso básico : imprimir datos de forma recursiva;

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

Estructura y algoritmo (04): reglas de ordenación y algoritmo de búsqueda

En base a las características de la estructura de la pila, la llamada recursiva formará la estructura anterior.Cuando todos los métodos recursivos se colocan con éxito en la pila, la acción de la pila se ejecutará a su vez y se imprimirá el resultado de los datos.

En el desarrollo real, la recursividad se utiliza a menudo para abordar problemas de estructura de árbol, algoritmos factoriales, búsqueda de clasificación y otros problemas matemáticos.

La condición del algoritmo recursivo debe estar constantemente cerca de la condición de salida; de lo contrario, es fácil hacer que un bucle infinito provoque una excepción de desbordamiento de memoria.

En segundo lugar, el algoritmo de clasificación

El algoritmo de clasificación es la operación de organizar un grupo de registros de datos en orden creciente o decreciente de acuerdo con una estrategia de clasificación específica; algoritmos de clasificación de uso común: clasificación de burbujas, clasificación de selección, clasificación de inserción, clasificación de colinas, clasificación de fusión, clasificación rápida, cardinalidad Clasificación, etc .; selección de algoritmos de clasificación: diferentes servicios de clasificación se pueden probar mediante múltiples algoritmos, con baja complejidad y un uso prioritario que requiere poco tiempo.

1. Clasificación de burbujas

Al comparar los valores de los elementos adyacentes en la secuencia de clasificación, si se encuentra el orden inverso, se realiza el intercambio, de modo que el elemento con el valor más grande se mueve gradualmente de adelante hacia atrás. El nombre del algoritmo se debe a que cuanto más pequeño es el elemento, flotará lentamente a través del intercambio de clasificación. Un extremo de la secuencia es como si las burbujas de dióxido de carbono en una bebida carbonatada eventualmente subieran a la parte superior, de ahí el nombre de burbuja.

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;
                }
            }
        }
    }
}

Idea central :

El número de elementos en la pasada de clasificación es el número de veces que se procesará en teoría; el intercambio de posición de cada elemento requiere una comparación completa y el bucle exterior está controlado. El bucle interior intercambia las posiciones de elementos individuales.

2. Elija ordenar

Principio de selección y ordenación: el elemento más pequeño (o más grande) se selecciona de los elementos de datos que se van a ordenar por primera vez, se almacena al principio de la secuencia, y luego el elemento más pequeño (grande) se encuentra entre los elementos restantes sin clasificar. Luego colóquelo al final de la secuencia ordenada. Y así sucesivamente, hasta que el número de todos los elementos de datos a ordenar sea cero.

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

第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. Orden de inserción

La idea básica es insertar un registro en una lista ordenada que ha sido ordenada. Cada vez que se toma el primer elemento de la lista desordenada durante el proceso de ordenación, se compara con los elementos de la lista ordenada por turno y se inserta en la lista ordenada. La posición adecuada en la secuencia de la mesa la convierte en una nueva mesa ordenada. En el proceso de implementación se utiliza un bucle de doble capa, el bucle externo busca todos los elementos excepto el primero, y el bucle interno busca la posición a insertar en la lista ordenada antes del elemento actual y lo mueve.

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

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

Tres, algoritmo de búsqueda

El algoritmo de búsqueda se refiere a encontrar un elemento de información específico en un grupo de elementos. En las aplicaciones informáticas, la búsqueda es una operación básica común, como la búsqueda de la tabla de símbolos en un compilador; los algoritmos de búsqueda más utilizados son: búsqueda secuencial, búsqueda binaria, interpolación Encuentra, Encuentra Fibonacci.

1. Buscar en orden

La búsqueda secuencial es un algoritmo de búsqueda básico que atraviesa un conjunto de elementos de acuerdo con la secuencia original de la secuencia y los compara con los elementos que se buscarán uno por uno.

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. Búsqueda binaria

La búsqueda binaria también se denomina búsqueda binaria, que es un método de búsqueda eficaz. Sin embargo, la búsqueda binaria requiere que la tabla lineal adopte una estructura de almacenamiento secuencial y los elementos de la tabla estén ordenados por palabras clave.

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;
        }
    }
}

Si los elementos que se van a consultar no están ordenados, puede ordenarlos primero y luego buscar según el algoritmo de ordenación del segundo módulo anterior.

Cuarto, la dirección del código fuente

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

Lectura recomendada: sistema de programación de acabado

Número de serie nombre del proyecto Dirección de GitHub Dirección GitEE Recomendado
01 Java describe patrones de diseño, algoritmos y estructuras de datos GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
02 Fundamentos Java, concurrencia, orientado a objetos, desarrollo web GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆
03 Explicación detallada del caso del componente básico del microservicio SpringCloud GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆
04 Caso completo de arquitectura de microservicio SpringCloud GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
05 Comenzando con la aplicación básica del marco SpringBoot a avanzado GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆
06 SpringBoot framework integra y desarrolla middleware común GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
07 Caso básico de gestión de datos, distribución, diseño de arquitectura GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
08 Grandes series de datos, almacenamiento, componentes, informática y otros marcos GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆

Supongo que te gusta

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