[Estructura de datos y algoritmo] Clasificación simple y detallada (clasificación de burbujas, clasificación de selección, clasificación de inserción) ideas completas y uso de código para encapsular la función de clasificación

Esta serie de artículos [Estructura de datos y algoritmo] Todo el código completo se ha subido a github , y aquellos que quieran el código completo pueden ir allí y obtenerlo directamente. Si es posible, haga clic en Star ~ Ponga un enlace de salto a continuación

En el artículo anterior, ya hablé sobre la estructura de datos que el front-end necesita comprender y todos la hemos encapsulado. Ahora vamos a explicar la parte del algoritmo de clasificación El algoritmo de clasificación, como su nombre indica, consiste en organizar un montón de datos desordenados de manera ordenada de acuerdo con ciertas reglas.

Al explicar el algoritmo de clasificación, se divide aproximadamente en dos categorías, como se muestra a continuación

Inserte la descripción de la imagen aquí
Este artículo presenta primero la realización de tres ideas sencillas de clasificación y la realización del código.

Inserte la descripción de la imagen aquí

Número público: la cabaña de programación de Lpyexplore.
Sígueme y actualiza las preguntas de la entrevista inicial de vez en cuando.
Hay más libros electrónicos , preguntas de la entrevista , estructuras de datos y códigos de algoritmos esperando que

1. Notación Big O

La notación Big O es un método de representación que representa aproximadamente la complejidad temporal de un algoritmo, donde la complejidad temporal del algoritmo representa el número de operaciones básicas requeridas por el código durante la ejecución del algoritmo.

Q: Supongamos que hay cinco individuos, respectivamente A, B, C, D, E, su altura, respectivamente 165, 178, 150, 180, 200, se encuentra el hombre más alto, y registrar el número de comparaciones.

Hablemos de un algoritmo particularmente simple y fácil de entender para comprender la notación Big O

R: Usemos Acon Bla comparación, fue Bmás que Aalto; luego usaremos Bcon la Ccomparación, fue Cmás que Bbajo; continuamos con Bla Dcomparación, fue Dmás que Balto; y finalmente Dcon Ela comparación, fue Emás que Dalto. Por lo tanto, los resultados finales Eson los más altos de los cinco hombres y tenemos que recordar el número de comparaciones para las próximas 4 veces.

Entonces lo mismo de esta manera, el número ahora está configurado n, luego tenemos que comparar el número de veces que puede tomar hasta n - 1veces, entonces podemos calcular la complejidad de tiempo de este algoritmo paraO(n)

¿Por qué es O(n)así? Debido a que este método de representación es en realidad un método estadístico vago, debemos seguir los siguientes principios :

  1. Solo se ejecuta la mayor cantidad de código
  2. Todas las constantes del término de suma se reemplazan por 1
  3. La constante del término de mayor orden se reemplaza por 1

Por lo tanto, cuando comparamos el número de veces n - 1que queremos tomar el término de grado más alto, y el término constante se convierte en el término de orden más alto 1, utilícelo como una notación O grandeO(n)

Hay varias otras notación O grande común como sigue:

símbolo nombre
O (1) constante
O (registro (n)) logaritmo
En) Lineal
O (nlog (n)) Producto lineal y logarítmico
O (n²) cuadrado
O ( 2 norte 2 ^ norte2n ) índice

Después de cada algoritmo de clasificación, simplemente juzgaremos su complejidad de tiempo y usaremos la notación O grande para representar

Dos, tipo burbuja

La clasificación de burbujas es uno de los algoritmos de clasificación más simples y groseros. Su método de clasificación es el mismo que su nombre, y los datos aparecen uno por uno.

Echemos un vistazo al proceso de implementación específico (el proceso de clasificación es de pequeño a grande) y veamos directamente una imagen en movimiento

Inserte la descripción de la imagen aquí
En realidad, la idea principal es comenzar desde la izquierda y comparar los tamaños de dos elementos adyacentes sucesivamente. Si el número de la izquierda es mayor que el número de la derecha, intercambie, de modo que después de comparar todos los elementos adyacentes, el número de la derecha sea uno de ellos. El mayor número.

Luego continúe comenzando desde el lado más a la izquierda, compare cada elemento adyacente por turno y determine si es necesario intercambiar posiciones, pero la diferencia con el primer paso es que el número más a la derecha no necesita ser comparado porque ya es el más grande. Por lo tanto, el segundo número de derecha a izquierda después de la segunda pasada es el segundo número más grande.

Por analogía, los datos se pueden organizar en orden ascendente

Echemos un vistazo a cómo encapsular la función de clasificación de burbujas

function bubbleSort(arr) {
    
    

	// 封装一个交换函数,便于之后调用
	function exchange(v1, v2) {
    
    
		let temp = arr[v1]
		arr[v1] = arr[v2]
		arr[v2] = temp
	}
	
	// 获取传入数组的长度
	let length = arr.length
	
	// 1. 设置每次遍历的长度,每遍历一次,长度 - 1
	for(let i = length - 1; i >= 0; i --) {
    
    
		// 2. 从最左边的数开始,依次比较相邻元素
		for(let j = 0; j < i; j ++) {
    
    
			// 3. 如果左边的数大于右边的数,则交换一下两个元素
			if(arr[j] > arr[j + 1]) {
    
    
				exchange(j, j + 1)
			}
		}
	}
	
	// 返回排序后的数组
	return arr
}

Simplemente probemos si el método es correcto

let arr = [45, 66, 1, 19, 34, 80, 2]

console.log(bubbleSort(arr));
// 打印结果:[1, 2, 19, 34, 45, 66, 80]

A continuación, hable sobre el tipo de burbuja del número de comparaciones y el número de intercambios sobre cómo solía representar la notación Big O.

Suponiendo que hay 4 números en una matriz, necesitamos comparar 3 veces para el primer recorrido y luego encontrar un valor máximo; para el segundo recorrido, solo necesitamos comparar 3 de ellos, y solo necesitamos comparar 2 veces. El segundo valor más grande; el tercer recorrido solo necesita comparar los dos números restantes, y solo necesita comparar una vez, y la matriz está ordenada. Si no lo entiende, puede mirar la animación de arriba.

Compara el número de casos de un total de 3 + 2 + 1 = 6veces. Luego, extendido al caso general, hay una matriz de nelementos, luego el número de comparaciones requeridas es un total (n-1) + (n-2) + …… + 2 + 1 = n*(n-1)/2, representa el estado de derecho de acuerdo con la gran O, encontramos que el término de mayor orden es n²/2, su término constante se establece en 1, es , por lo tanto burbujeando El número de comparaciones para la clasificación se expresa en Big OO(n²)

Echemos un vistazo a cómo se representa el número de intercambios de tipo burbuja mediante la notación O grande. Obviamente, no sabemos exactamente cuántas veces intercambiar, por lo que asumimos que cada dos comparaciones deben intercambiarse, el número total de intercambios es n*(n-1)/4. De acuerdo con las reglas de la notación Big-O, podemos saber que el número de intercambios es gran O La notación también esO(n²)

para resumir:

  1. Número de comparaciones de clasificación de burbujas: O (n²)
  2. Número de intercambios por clasificación de burbujas: O (n²)

Tres, seleccione ordenar

La clasificación selectiva es muy similar a la clasificación de burbujas. La única diferencia es que cada vez que se recorre la clasificación de selección, los elementos se comparan y el índice del valor máximo o mínimo se almacena en una variable. Después de completar todas las comparaciones, el índice de la Los elementos se intercambian. En pocas palabras, la clasificación de selección se intercambia una vez para cada recorrido y la clasificación de burbuja debe cambiarse varias veces para cada recorrido. Por lo tanto, la clasificación de selección es generalmente más eficiente que la clasificación de burbuja.

Del mismo modo, echemos un vistazo a la visualización de la animación del tipo de selección (ordenada de pequeña a grande):

Inserte la descripción de la imagen aquí
Echemos un vistazo al paquete de código para seleccionar ordenar

function selectionSort(arr) {
    
    
    // 封装交换元素的函数,方便后面调用
    function exchange(v1, v2) {
    
    
        let temp = arr[v1]
        arr[v1] = arr[v2]
        arr[v2] = temp
    }
	
	// 获取传入数组的长度
    let length = arr.length
	
	// 1. 设定遍历的范围
	for(let i = 0; i < length - 1; i ++) {
    
    
		// 2. 先将遍历的起始索引设为最小值的索引
		let min = i
		// 3. 从索引为min的后一个值开始遍历全部元素
		for(let j = min; j < length; j ++) {
    
    
			// 3.1 将每个遍历到的元素与arr[min]比较
			if(arr[min] > arr[j]) {
    
    
				min = j
			}
		}
		// 4. 将得到的最小值的索引min上的元素与我们初始遍历的位置上的元素交换
		exchange(min, i)
	}

	// 返回排序后的数组
	return arr
}

Probemos si el método es correcto

let arr = [45, 66, 1, 19, 34, 80, 2]

console.log(selectionSort(arr));
// 打印结果:[1, 2, 19, 34, 45, 66, 80]

Después de comprender la diferencia entre el ordenamiento por selección y el ordenamiento por burbujas, deberíamos poder saber claramente que el número de comparaciones del ordenamiento por selección es el mismo que el del ordenamiento por burbujas, por lo que el número de comparaciones del ordenamiento por selección se expresa en notación O grandeO(n²)

Cada vez que el orden de selección atraviesa la matriz, los datos solo deben intercambiarse una vez, por lo que el número de intercambios se expresa en notación O grande comoO(n)

para resumir:

  1. Número de comparaciones para el orden de selección: O (n²)
  2. Número de intercambios para la clasificación por selección: O (n)

Cuatro, ordenación por inserción

La clasificación por inserción es un algoritmo de clasificación que compara un elemento especificado con un elemento de área ordenada e intercambia posiciones.

Démosle un ejemplo simple. Supongamos que existe una matriz desordenada.

Inserte la descripción de la imagen aquí
En primer lugar, consideramos como una región el elemento con índice 0. La región está ordenada, dado que solo hay un elemento, es un elemento en cualquier orden, por lo que se considera ordenado.

Luego tomamos el primer elemento de las regiones ordenadas a la derecha, es decir, el índice del elemento 1 67, la variable almacenada tempen. Y desde el comienzo de las regiones ordenadas más a la derecha, los elementos variables secuencialmente tempelementos en 67comparación, si son mayores que 67, luego se mueven a la posición derecha de un marco; si son menos de 67, no hay necesidad de continuar atravesando porque esta región está ordenada de.

FIG movible primer recorrido:
Inserte la descripción de la imagen aquí
en este caso 索引0 ~ 索引1se saca la región ordenada de esta sección, indexaremos el elemento 2, en comparación con las regiones ordenadas de los elementos

La animación para el segundo recorrido:

Inserte la descripción de la imagen aquí
En este momento, el área se ordenó 索引0 ~ 索引2esta sección, quitaremos el elemento índice 3, la comparación con los elementos ordenados área

La animación del tercer recorrido:

Inserte la descripción de la imagen aquí
En este momento, el área se ordenó en 索引0 ~ 索引3esta sección, eliminaremos el índice de elementos de 4, lo compara con el área de elementos ordenados

La animación del cuarto recorrido:

Inserte la descripción de la imagen aquí
En este momento, toda la matriz es un área ordenada, que es una clasificación de inserción completa

A continuación, encapsularemos una función para ordenar por inserción

function insertionSort(arr) {
    
    
	// 获取传入数组的长度
    let length = arr.length
	
	// 1. 从索引为1的元素开始向后遍历数组
	for(let i = 1; i < length; i ++) {
    
    
		// 2. 取出有序区域右边第一个元素
		let temp = arr[i]
		let j = i
		// 3. 从右往左将有序区域内的元素与temp比较
		while(arr[j - 1] > temp && j > 0) {
    
    
			arr[j] = arr[j - 1]
			j --
		}
		// 4. 将temp插入到合适的位置
		arr[j] = temp
	}
	
	// 返回排序后的数组
	return arr
}

Probemos si la función es correcta

let arr = [45, 66, 1, 19, 34, 80, 2]

console.log(insertionSort(arr));
// 打印结果:[1, 2, 19, 34, 45, 66, 80]

Cada vez que se atraviesa la ordenación por inserción, el número de comparaciones y el número de movimientos de elementos son inciertos, por lo que consideramos el peor de los casos.

El primer recorrido: el número de comparaciones es 1, el número de movimientos de elementos es 1; el
segundo recorrido: el número de comparaciones es 2, el número de movimientos de elementos es 2;
...
Enésimo recorrido: el número de comparaciones es N, el número de movimientos de elementos es N;

Por lo tanto, el número de comparaciones para la ordenación por inserción es 1 + 2 + …… + n, y el número de movimientos de elementos es el mismo que el número de comparaciones. Luego tomamos un valor promedio, es decir (n² - n)/4, expresado en notación Big O comoO(n²)

para resumir:

  1. El número de comparaciones para la ordenación por inserción: O (n²)
  2. Número de movimiento de elementos para la clasificación de inserción: O (n²)

Seis, observaciones finales

La clasificación simple en el algoritmo de clasificación ha terminado. El siguiente artículo explicará tres algoritmos de clasificación avanzados : clasificación de colinas, clasificación de combinación y clasificación rápida.

Puede seguirme y continuaré actualizando otros artículos sobre algoritmos y estructuras de datos para que todos puedan aprender, y colocaré estos artículos en la columna [Estructura de datos y algoritmos] para que todos los aprendan y usen.

Entonces puedes prestar atención a mi cuenta oficial de WeChat : la cabaña de programación de Lpyexplore . Después de que el artículo en esta columna esté terminado, pondré las notas de cada estructura de datos y algoritmo en la cuenta oficial , y puedes ir allí para obtenerlo.

O puede ir a mi github para obtener el código completo , bienvenidos a todos a ordenar Star

Soy Lpyexplore. No es fácil de crear. Si te gusta, agrega atención, haz clic en un favorito, da un me gusta ~

Supongo que te gusta

Origin blog.csdn.net/l_ppp/article/details/108498581
Recomendado
Clasificación