Implementación js: algoritmo de clasificación con complejidad O (n ^ 2) (clasificación de burbuja, clasificación de selección simple, clasificación de inserción directa)

Blog de referencia:
1. Resumen de varios algoritmos de clasificación (completo)
2. [Resumen del algoritmo] Los diez algoritmos de clasificación principales

(Suponga que la dirección de clasificación de los siguientes algoritmos es: de pequeño a grande. El número de elementos de la matriz es: n)
inserte la descripción de la imagen aquí

1. Clasificación de burbujas

1. Principio:

——El número de elementos a organizar es n
(1) Primero, entre los n elementos, el elemento más grande se organiza al final, y el número de elementos a organizar es n-1. [Se determina la posición de un elemento]
(2) Organice el segundo elemento más grande entre los n-1 elementos hasta el final de los elementos que se van a ordenar , y el número de elementos que se van a ordenar es n-2. [Se determinan las posiciones de los dos elementos]
...
(n-1) Repita los pasos anteriores n-1 veces hasta que el número de elementos a clasificar sea 1. [La posición de n-1 elementos está determinada, por lo que no es necesario determinar los elementos restantes, ¿verdad? Guardó un ciclo]

Ejemplo: arr=[2,6,4,10,3]
(1) tiempo: 2 es menor que 6, sin intercambio; 6 es mayor que 4, intercambio; 6 es menor que 10, sin intercambio; 10 es mayor que 3, intercambio
En este punto, la matriz se convierte en: [2,4,6,3, 10 ], ¡la posición de 10 está determinada!
(2) pase: 2 es menor que 4, no se intercambia; 4 es menor que 6, no se intercambia; 6 es mayor que 3, se intercambia; en este momento la matriz se convierte en: [2,4,3
, 6,10 ], la posición de 6 ¡Está bien!
La tercera vez: 2 es menor que 4, no intercambie; 4 es mayor que 3, intercambie;
en este momento la matriz se convierte en: [2,3, 4,6,10 ], ¡la posición de 4 está determinada!
Paso (4): 2 es más pequeño que 3, no intercambie
En este momento, la matriz se convierte en: [2, 3, 4, 6, 10 ], ¡se determina la posición de 3!
¡La posición de 2 está naturalmente determinada!

2. Código:

Poner el valor máximo entre los elementos a ordenar al final es en realidad comparar elementos adyacentes de dos en dos, y si arr[j]>arr[j+1] , intercambiar sus posiciones. Hasta j+1==arr.length-1 , termina un ciclo

<script>
	let arr = [2,6,4,10,3];
	console.log(bubbleSort(arr));
	
	/**
	 * @param {array} arr
	 */
	function bubbleSort(arr){
    
    
		// 要确定原数组中,哪一个元素的位置
		for(let i=arr.length-1; i>0; i--){
    
    
			// 待排元素的范围:为什么 j 要小于i,为了保证 j+1 不越界
			for(let j=0; j<i; j++){
    
    
				if(arr[j]>arr[j+1]) swap(arr, j, j+1);
			}
		}
		return arr;
	}
	
	/**
	 * @param {array} arr
	 * @param {int} i
	 * @param {int} j
	 */
	function swap(arr, i, j){
    
    
		let temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
</script>

El intercambio de posiciones entre elementos es muy común en los algoritmos de clasificación. Por lo tanto, aquí se escribe como una función de intercambio por separado para aumentar la reutilización del código.

3. Optimización

Si la matriz se reemplaza con una matriz relativamente ordenada, como: [2,10,3,4,5,6], ¿es necesario recorrer tantas veces?
Obviamente, esta matriz solo necesita ser recorrida una vez y ya está en orden.
[Pensando]: ¿Puede agregar un cambio de bandera, cuando la matriz ya está en orden, finalice el ciclo?

<script>
	function bubbleSort(arr){
    
    
		for(let i=arr.length-1; i>0; i--){
    
    
			let change = false; // 标志位
			for(let j=0; j<i; j++){
    
    
				if(arr[j]>arr[j+1]){
    
    
					swap(arr, j, j+1);
					change = true; // 修改标志位
				}
			}
			if(change == false) break; // 标志位。结束循环
		}
		return arr;
	}
</script>

[2,10,3,4,5,6]
Después de que termine el primer ciclo, la matriz ya está en orden;
después de que finalice el segundo ciclo, el bit de bandera no se modificará; por lo tanto, el ciclo terminará y
el tercer ciclo no ser ejecutado.

2. Clasificación de selección simple

1. Principio

En realidad, es muy similar a la clasificación de burbujas, y también es una comparación entre dos pares, pero en este momento no se intercambiará, sino que se registrará; después de atravesar toda la secuencia sin clasificar, encuentre el mayor valor
en la secuencia sin clasificar antes intercambiando [Se puede considerar que la clasificación por selección es una mejora de la clasificación por burbujas]

Suposición: el frente de la matriz es una secuencia ordenada y el reverso es una secuencia no ordenada.
Debido a que está ordenado de menor a mayor, seleccionamos el valor mínimo de la siguiente secuencia y lo colocamos al final de la secuencia ordenada (es decir, intercambio con el último elemento de la secuencia ordenada) Por ejemplo: arr=[
4,3 ,2,5,6]
(1) tiempo: la secuencia ordenada está vacía, [], la secuencia no ordenada es: [4,3,2,5,6], seleccione el valor mínimo: 2, siga la secuencia ordenada El último elemento de , es decir, se intercambia con 4. [2,3,4,5,6]
(2) tiempo: la secuencia ordenada está vacía, [2], la secuencia no ordenada es: [3,4,5,6], seleccione el valor mínimo: 3, siga el último elemento de la secuencia ordenada, es decir, se intercambia con 3. [2,3,4,5,6]
(3) tiempo: la secuencia ordenada está vacía, [2,3], la secuencia no ordenada es: [4,5,6], el valor mínimo seleccionado: 4, siga el último elemento de la secuencia ordenada, es decir, se intercambia con 4. [2,3,4,5,6]
El (4º) viaje: la secuencia ordenada está vacía, [2,3,4], la secuencia no ordenada es: [5,6], el valor mínimo seleccionado: 5, siga El último elemento de la secuencia ordenada, es decir, se intercambia con 5. [2,3,4,5,6]
(5º) viaje: la secuencia ordenada está vacía, [2,3,4,5], la secuencia no ordenada es: [6], seleccione el valor mínimo: 6, siga el último elemento de la secuencia ordenada, es decir, se intercambia con 6. [2,3,4,5,6]

Incluso si se ordena toda la matriz, se seguirá buscando el valor mínimo siempre que la secuencia sin ordenar no esté vacía.
Si hay alguna mejora sobre la clasificación de burbujas, ¿debería ser reducir la cantidad de intercambios?

2. Código

function selectSort(arr){
    
    
	// 已排序序列的右区间+1。
	// i是从0开始,已排序右区间最开始应该理解成-1?
	for(let i in arr){
    
    
		// 假设未排序序列的第一个元素为min
		let min_index = i;
		// 未排序序列的左区间
		for(let j=i; j<arr.length; j++){
    
    
			min_index = arr[j] < arr[min_index] ? j : min_index;
		}
		swap(arr, i, min_index);
	}
	return arr;
}

3. Clasificación por inserción

1. Principio

También es muy similar al ordenamiento por selección, dividiendo la matriz en dos partes: la secuencia ordenada y la secuencia no ordenada. Sin embargo, aquí el primer elemento se ordena de forma predeterminada , y el orden de selección anterior es la secuencia ordenada predeterminada que está vacía (porque en el orden de selección, la posición en la secuencia ordenada no cambia una vez determinada)

1. Saque la clave del primer elemento de la secuencia sin clasificar y escanee de atrás hacia adelante en la secuencia ordenada. Una vez que se encuentre el elemento arr[j] que es más grande que la clave, muévalo hacia atrás un bit ( porque la clave es más grande que arr [j] es pequeña, debe estar en el frente, para dejar espacio para la clave).
2. Hasta que se encuentre un elemento **arr[j]** que sea más pequeño que la clave, entonces la clave se coloca detrás de arr[j]. arr[j+1]=key
3. Si no se encuentra ningún valor más pequeño que key después de recorrer la secuencia ordenada, significa que la clave debe colocarse al frente

2. Código

function insertSort(arr){
    
    
	// 未排序序列
	for(let i=1; i<arr.length; i++){
    
    
		// 记录下要排序的元素
		let key = arr[i];
		// 已排序序列
		for(var j=i-1; j>=0 && key < arr[i]; j--){
    
    
			arr[j+1] = arr[j];
		}
		// 跳出循环的条件:j<0 || 遇到比key小的值
		arr[j+1] = key;		
}

Supongo que te gusta

Origin blog.csdn.net/qq_38432089/article/details/124220384
Recomendado
Clasificación