Estructura de datos y algoritmo (implementación de Golang) (21) Clasificación de algoritmo de inserción

Insertar ordenación

Ordenación por inserción, generalmente nos referimos a la ordenación por inserción simple u ordenación por inserción directa. Es decir, cada vez que se inserta un número en la secuencia ya organizada para formar una nueva secuencia secuenciada, y así sucesivamente.

La ordenación por inserción pertenece al algoritmo de ordenación por inserción.

A excepción de mí, algunas personas están acostumbradas a jugar póker desde la segunda carta, en comparación con la primera carta. Si la segunda carta es más pequeña que la primera carta, se inserta delante de la primera carta, de modo que las dos primeras cartas son ambas El orden se ordena y, a partir de la tercera carta, se inserta en las primeras dos cartas en el orden ordenado para formar tres cartas ordenadas, y la cuarta carta en el reverso se inserta en el orden ordenado al frente. Las tres cartas de la lista están ordenadas.

1. Introducción al algoritmo

Para un ejemplo simple, inserte una secuencia de 4 elementos 4 2 9 1::

[]表示排好序

第一轮: [4] 2 9 1 拿待排序的第二个数 2,插入到排好序的数列 [4]
    与排好序的数列 [4] 比较
    第一轮进行中:2 比 4 小,插入到 4 前
第二轮: [2 4] 9 1 拿待排序的第三个数 9,插入到排好序的数列 [2 4]
    与排好序的数列 [2 4] 比较
    第二轮进行中: 9 比 4 大,不变化
第三轮: [2 4 9] 1 拿待排序的第四个数 1,插入到排好序的数列 [2 4 9]
    与排好序的数列 [2 4 9] 比较
    第三轮进行中: 1 比 9 小,插入到 9 前
    第三轮进行中: 1 比 4 小,插入到 4 前
    第三轮进行中: 1 比 2 小,插入到 2 前
结果: [1 2 4 9]

En el mejor de los casos, insertando una secuencia ordenada de números, N-1se necesitan rondas iterativas , y debido a que la primera comparación en cada ronda, el número a ordenar es mayor que el número a su izquierda, entonces esta ronda ha terminado , no es necesario comparar, no necesitan ser cambiados, esta vez la complejidad es: O(n).

En el peor de los casos, en cada ronda de comparación, el número a ordenar es más pequeño que todos los números en el orden izquierdo, luego debe intercambiarse N-1, la primera ronda debe compararse e intercambiarse una vez, y la segunda ronda debe compararse e intercambiarse dos veces. dos y cincuenta y siete, cuatro a la cuarta ronda, este número es: 1 + 2 + 3 + 4 + ... + N-1complejidad del tiempo y ordenamiento de burbuja, ordenación por selección, son: O(n^2).

Debido a que es de derecha a izquierda, los números sin ordenar se insertan en la cola ordenada a la izquierda, por lo tanto, inserte la clasificación, el orden del mismo número no cambiará después de la clasificación, este algoritmo de clasificación es estable.

2. Implementación de algoritmos

package main

import "fmt"

func InsertSort(list []int) {
    n := len(list)
    // 进行 N-1 轮迭代
    for i := 1; i <= n-1; i++ {
        deal := list[i] // 待排序的数
        j := i - 1      // 待排序的数左边的第一个数的位置

        // 如果第一次比较,比左边的已排好序的第一个数小,那么进入处理
        if deal < list[j] {
            // 一直往左边找,比待排序大的数都往后挪,腾空位给待排序插入
            for ; j >= 0 && deal < list[j]; j-- {
                list[j+1] = list[j] // 某数后移,给待排序留空位
            }
            list[j+1] = deal // 结束了,待排序的数插入空位
        }
    }
}

func main() {
    list := []int{5}
    InsertSort(list)
    fmt.Println(list)

    list1 := []int{5, 9}
    InsertSort(list1)
    fmt.Println(list1)

    list2 := []int{5, 9, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3}
    InsertSort(list2)
    fmt.Println(list2)
}

Salida:

[5]
[5 9]
[1 3 4 5 6 6 6 8 9 14 25 49]

En la nmayoría de los casos donde el tamaño de la matriz es pequeño, podemos usar la ordenación por inserción, que es más rápida que la ordenación por burbujas y la ordenación por selección, e incluso más rápido que cualquier algoritmo de ordenación.

Cuanto mayor sea el orden en la secuencia, mayor será el rendimiento de la ordenación de inserción, porque cuanto mayor sea el orden de la matriz a clasificar, menor será el número de comparaciones de ordenación de inserción.

Casi nunca se utilizan algoritmos de selección de burbujeo, selección directa e inserción directa, porque estos algoritmos son muy ineficientes bajo números desordenados con una gran cantidad de elementos.

Entrada de artículo de serie

Soy la estrella Chen, bienvenido he escrito personalmente estructuras de datos y algoritmos (Golang lograr) , comenzando en el artículo para leer más amigable GitBook .

Supongo que te gusta

Origin www.cnblogs.com/nima/p/12724855.html
Recomendado
Clasificación