Insertar sort-direct insert sort y Hill sort

# Clasificación de inserción directa por algoritmo y clasificación de Hill
Hoy, presentamos la clasificación de inserción directa y el método de clasificación optimizado Clasificación de Shell en la clasificación de inserción.

Tipo de inserción directa

La ordenación por inserción directa es uno de los métodos de ordenación más básicos en los que la gente puede pensar. Este método de ordenación divide la secuencia que se ordenará en dos partes, una parte se ordena y la otra no. Al principio, la parte ordenada contiene solo un elemento, por lo que está naturalmente ordenada. Cada vez, un elemento de la otra parte, es decir, la secuencia a ordenar, se compara con la secuencia ya ordenada en secuencia: los elementos que son más grandes que secuencialmente Mueva una posición hacia la derecha hasta que encuentre el elemento que es más pequeño o más pequeño en la parte ordenada, lo que determina la posición correcta del elemento a ordenar.

El diagrama de demostración dinámica es el siguiente: el
Diagrama de clasificación de inserción directa
código se implementa de la siguiente manera:

public class InsertSort {

    public static void main(String[] args) {
        Integer[] arr = {8, 6, 1, 3, 9, 7, 2, 5, 4};

        // 外层循环:每次将无序部分第一个元素插入到前面有序部分中正确位置
        for (int i = 1; i < arr.length; i++) {
            int j = i - 1;
            int tmp = arr[i];

            // 内层循环:将外层元素依次与已排序列元素比较
            while (j >= 0 && arr[j] > tmp) {
                // 保证已排序部分有序性,较大元素右移
                arr[j + 1] = arr[j];
                j--;
            }
            // 找到排序位置后插入
            arr[j+1] = tmp;
        }
        
		// test-打印
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

}

La complejidad de tiempo óptima es O (n), es decir, una secuencia ya ordenada. Solo cada elemento necesita ser comparado una vez, y el promedio y el peor de los casos es O (n ^ 2).

Tipo de concha

La ordenación en pendiente se basa en la ordenación por inserción directa, que promueve las ventajas de la ordenación por inserción directa en el caso de secuencias pequeñas y ordenación básica. Utiliza la idea de dividir y conquistar para agrupar las secuencias originales y luego ordenar los elementos en el grupo por separado. Luego reduzca el número de grupos y aumente el número de elementos en el grupo hasta que el grupo se fusione en uno.

El diagrama de demostración dinámico es el siguiente: el
Diagrama esquemático de clasificación de conchas
código se implementa de la siguiente manera (el diagrama de demostración no corresponde al código):

/**
 * @description: 希尔排序基本实现
 * @author: liyaguang
 * @create: 2018-08-31 13:41
 **/
public class ShellSort {

    public static void main(String[] args) {
        Integer[] arr = {8, 6, 1, 3, 9, 7, 2, 5, 4};

        // 确定分组个数,即确定了每个子序列,也是子序列步长
        for (int i = arr.length / 2; i > 0; i /= 2) {
            // 循环每个子序列,进行排序
            for (int j = 0; j < i; j++) {
                // j、j+i、j+i+i、……、n-i

                // 调用插入排序方法,传入子序列值
                modInsertSort(arr, j, i);
            }
        }

        // 若增量序列中不能保证最后的间距为1,则执行一次扫尾工作,此方法内不需要
        // modInsert(arr, 0, 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }

    /**
     * @param arr      待排数组
     * @param startPos 待排子序列起始位置
     * @param delta    步长/分组个数
     */
    public static void modInsertSort(Integer[] arr, int startPos, int delta) {
        for (int i = startPos + delta; i < arr.length - startPos; i += delta) {

            for (int j = i; j > startPos; j -= delta) {
                if (arr[j] < arr[j - delta]) {
                    // swap(arr, y, y -= i);
                    int tmp = arr[j - delta];
                    arr[j - delta] = arr[j];
                    arr[j] = tmp;
                } else {
                    break;
                }
            }
        }
    }
}

La complejidad del tiempo de la clasificación de Hill está estrechamente relacionada con la estrategia de agrupación seleccionada. De la manera anterior, el método de "número de agrupaciones dividido por 2 disminuciones" es en realidad la complejidad del tiempo sigue siendo O (n ^ 2). Mejore efectivamente la eficiencia de la clasificación de Hill, algunos pueden alcanzar O (n ^ 3/2), O (n ^ 5/4), y algunos incluso pueden llegar a O (n ^ 7/6), muy cerca de O (nlogn )

Resumen

La clasificación por inserción directa es una de las formas más probables de clasificar en nuestras vidas. Por ejemplo, para clasificar los resultados de una clase, utilizamos un papel en blanco lo suficientemente largo como para registrar primero al primer alumno en la secuencia que se ordenará. Para los resultados, compare los resultados del segundo alumno con el primero para encontrar una posición adecuada, y luego compare los terceros datos que se clasificarán con los dos primeros para lograr el efecto de clasificación final.
El uso de la ordenación por inserción directa es muy intuitivo y efectivo cuando la cantidad de datos en la vida es pequeña y la secuencia a clasificar es básicamente ordenada. La complejidad del tiempo puede controlarse en O (n), mientras que la ordenación Hill se basa en la ordenación por inserción directa En el juego completo de sus ventajas, el uso de agrupar, dividir y conquistar la forma de hacerse cada vez más pequeño, y luego aprovechar gradualmente los resultados básicos ordenados en el proceso de fusión.

Referencia:
"Estructura de datos y algoritmo"
Inserción sort-
Wikiwand Shellsort-wikiwand

Bienvenido a prestar atención a mi cuenta pública para obtener más información:
Mi cuenta publica

Publicado 159 artículos originales · elogiados 225 · 210,000 visitas

Supongo que te gusta

Origin blog.csdn.net/lyg673770712/article/details/82263514
Recomendado
Clasificación