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-1
se 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-1
complejidad 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 n
mayorí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 .
- Estructura de datos y algoritmo (implementación de Golang) (1) Una introducción simple a Golang-Prefacio
- Estructuras de datos y algoritmos (implementación de Golang) (2) Una introducción simple a los paquetes, variables y funciones de Golang
- Estructura de datos y algoritmo (implementación de Golang) (3) Una introducción simple a la declaración de control de flujo de Golang
- Estructuras de datos y algoritmos (implementación de Golang) (4) Una introducción simple a las estructuras y métodos de Golang
- Estructura de datos y algoritmo (implementación de Golang) (5) Una introducción simple a la interfaz de Golang
- Estructura de datos y algoritmo (implementación de Golang) (6) Una introducción simple a la concurrencia, las rutinas y los canales de Golang
- Estructura de datos y algoritmo (implementación de Golang) (7) Una introducción simple a la biblioteca estándar de Golang
- Estructura de datos y algoritmo (implementación de Golang) (8.1) Conocimientos básicos-Prefacio
- Estructura de datos y algoritmo (implementación de Golang) (8.2) Conocimiento básico: dividir y conquistar y recurrir
- Estructura y algoritmo de datos (implementación de Golang) (9) Complejidad del algoritmo de conocimiento básico y símbolo progresivo
- Estructura de datos y algoritmo (implementación de Golang) (10) Conocimientos básicos: el método principal de complejidad del algoritmo
- Estructuras de datos y algoritmos (implementación de Golang) (11) Estructuras de datos comunes-Prefacio
- Estructuras de datos y algoritmos (implementación de Golang) (12) Listas enlazadas de estructuras de datos comunes
- Estructuras de datos y algoritmos (implementación de Golang) (13) Estructuras de datos comunes: matrices de longitud variable
- Estructuras de datos y algoritmos (implementación de Golang) (14) Estructuras de datos comunes: pila y cola
- Estructuras de datos y algoritmos (implementación de Golang) (15) Lista de estructuras de datos comunes
- Estructuras de datos y algoritmos (implementación de Golang) (16) Estructuras de datos comunes-Diccionario
- Estructuras de datos y algoritmos (implementación de Golang) (17) Estructuras de datos comunes: árboles
- Estructura de datos y algoritmo (implementación de Golang) (18) Algoritmo de clasificación-Prefacio
- Estructura de datos y algoritmo (implementación de Golang) (19) Algoritmo de clasificación-clasificación de burbujas
- Estructura de datos y algoritmo (implementación de Golang) (20) Clasificación de algoritmos de selección
- Estructura de datos y algoritmo (implementación de Golang) (21) Clasificación de algoritmo de inserción
- Estructura de datos y algoritmo (implementación de Golang) (22) Algoritmo de clasificación-Clasificación de Hill
- Estructura de datos y algoritmo (implementación de Golang) (23) Clasificación de algoritmo de fusión
- Estructura de datos y algoritmo (implementación de Golang) (24) Algoritmo de clasificación prioritario y clasificación de montón
- Estructura de datos y algoritmo (implementación de Golang) (25) Algoritmo de clasificación: clasificación rápida
- Estructura de datos y algoritmo (implementación de Golang) (26) Tabla de algoritmo de búsqueda de hash
- Estructura de datos y algoritmo (implementación de Golang) (27) Árbol de búsqueda binario de algoritmo de búsqueda
- Estructura y algoritmo de datos (implementación de Golang) (28) Árbol de algoritmo de búsqueda-AVL
- Estructura de datos y algoritmo (implementación de Golang) (29) Árbol de algoritmo de búsqueda-2-3 y árbol rojo-negro inclinado a la izquierda
- Estructura de datos y algoritmo (implementado por Golang) (30) Árbol de algoritmo de búsqueda-2-3-4 y árbol rojo-negro ordinario