[Algoritmo y estructura de datos JS] Implementación de algoritmos de ordenación por inserción, selección y burbujeo

Prefacio

Se ha creado una clase de lista para el algoritmo de clasificación: [estructura de datos JS] Encapsulación de la lista del algoritmo de clasificación

¡Aprendamos a implementar juntos varios algoritmos de clasificación comunes!

texto

1. Clasificación de burbujas

El algoritmo de clasificación más básico y simple.

La idea principal

  • El primer paso es comparar elementos adyacentes. Si el número de la izquierda es mayor que el número de la derecha, intercambie los dos.
  • El segundo paso es moverse hacia la derecha y realizar la primera operación en cada par de elementos adyacentes. Hasta que se complete el último par de operaciones de la lista, finalmente se determina que el último elemento es el valor máximo.
  • En la tercera parte, repita las operaciones del primer y segundo paso, reduciendo sucesivamente el número de desplazamientos a la derecha hasta que no haya par de elementos para comparar.

Para el siguiente sin lista, lo ordenamos. Implementación del código del
Inserte la descripción de la imagen aquí
efecto de animación Si necesita usar dos números para intercambiar, llame al método:
Inserte la descripción de la imagen aquí

// 交换两个数
ArrayList.prototype.swap = function (a, b) {
    
    
    var temp = this.array[a];
    this.array[a] = this.array[b];
    this.array[b] = temp;
}

Algoritmo de clasificación de burbujas

// 冒泡排序
ArrayList.prototype.bubbleSort = function () {
    
    
    // 1.获取数组的长度
    var length = this.array.length;
    // 第一次: i = 0; 比较0 和1 的位置的两个数据,如果0位置的数据比1位置的数据大,则交换
    // 最后一次: i = length - 2 , 比较的是length - 2 和length - 1的两个数
    for (var i = length - 1; i > 0; i--) {
    
    
        for (var j = 0; j < i; j++) {
    
    
            if (this.array[j] > this.array[j + 1]) {
    
    
                // 2.交换两个数
                this.swap(j, j + 1);
            }
        }
    }
}

La eficiencia de la clasificación de burbujas
Para el ejemplo anterior, podemos saber que en los 6 datos, el número total de veces que comparamos es:
5 + 4 + 3 + 2 + 1 (veces)
Luego, para el número de N, podemos deducir :
(N-1) + (N-2) + (N-3) +… + 1 = N * (N + 1) / 2 (veces)
Luego, en la notación O grande anterior, podemos obtener la notación O grande para la clasificación de burbujas es O (N 2 )

La complejidad del tiempo es O (N 2 )

La optimización de la
clasificación de burbujas requiere un total de N * (N + 1) / 2 (veces) comparaciones. En el peor de los casos, es necesario intercambiar N * (N + 1) / 2 (veces). Considere aquí, en el final posición antes de determinar la posición del período de intercambio, en realidad es innecesario y, por lo tanto, es necesario reducir los tiempos de conmutación .

2. Elija ordenar

La clasificación por selección es una mejora de la clasificación por burbujas, principalmente para reducir el número de intercambios, porque no todos los intercambios son necesarios, reduce el número de intercambios de N 2 a N, pero el número de comparaciones sigue siendo N 2 veces.

La idea principal

  • El primer paso es recorrer toda la lista y extraer el elemento más grande (o más pequeño) de ella y colocarlo al principio de la lista sin clasificar;
  • El segundo paso es extraer el elemento más grande (o más pequeño) de la lista restante sin clasificar y colocarlo al final de la lista ordenada.
  • En la tercera parte, repita la operación del segundo paso, reduciendo sucesivamente el rango de extracción del mayor valor hasta el último dígito de la lista sin clasificar.

Ordenamiento de burbuja
Inserte la descripción de la imagen aquí
Seleccionar algoritmo de clasificación

// 选择排序
ArrayList.prototype.selectSort = function () {
    
    
    // 1. 获取数组的长度
    var length = this.array.length,
    min;
    // 2.每一次减少提取最小值的范围,直到未排序序列的最后一个元素。
    for (var i = 0; i < length - 1; i++) {
    
    
        min = i;
        // 第一次:遍历整个数组,选出最小的元素。
        // 第n次:剩下最后一个元素。
        for (var j = min; j < length; j++) {
    
    
            if (this.array[min] > this.array[j]) {
    
    
                min = j;
            }
        }
        // 将最小的数放到已排序序列的末尾
        this.swap(min, i);
    }
}

La eficiencia de la clasificación selectiva es la
misma que la de la clasificación de burbujas. En el peor de los casos, el número de comparaciones necesarias también es N * (N + 1) / 2 (veces), pero el número de intercambios se reduce, por lo que es generalmente se considera que la clasificación selectiva se está ejecutando La eficiencia es mayor que la clasificación de burbujas

La complejidad del tiempo es O (N 2 )

Optimización La
selección y ordenación requiere un total de N * (N + 1) / 2 comparaciones , y es necesario reducir el número de comparaciones .

3. Orden de inserción

La clasificación por inserción es la más eficiente de la clasificación simple (burbujeo, selección, inserción).
Antes de ingresar a la clasificación avanzada, la clasificación por inserción es la base, y comprender que la clasificación por inserción es de gran ayuda para comprender la clasificación avanzada.
La idea central del ordenamiento por inserción es el orden parcial

¿Qué es un pedido parcial?
Por ejemplo, seleccionamos a una persona del equipo como jugador marcado;
entonces todos los jugadores a la izquierda del jugador marcado ya están en orden, es decir, en proceso de hacer cola, algunas personas están ordenadas y otras están ordenadas. Sin clasificar.

La idea principal

  • El primer paso es tratar el primer elemento como una lista ordenada y la lista restante como una lista desordenada;
  • El segundo paso es comenzar con el primer elemento de la lista desordenada e insertarlo en la posición correspondiente de la lista ordenada sucesivamente. La comparación durante el período es el último de la lista ordenada y el primero de la lista desordenada, para el orden de la lista ordenada. A la izquierda, realice una comparación secuencial para la inserción.

Sigue siendo el ejemplo anterior para ordenación por inserción,
Ordenamiento de burbuja
animación de ordenación por inserción
Inserte la descripción de la imagen aquí

Algoritmo de ordenación por inserción

// 插入排序
ArrayList.prototype.insertionSort = function(){
    
    
    // 1. 获取数组的长度
    var length = this.array.length,
    temp,j;

    // 2. 外层循环,从第2个元素(索引为1)开始获取数据,将它作为标记,向前面局部有序的列表中插入
    for(var i = 1; i < length; i++){
    
    
        // 3. 内层循环,将标记元素和前面的数据依次进行比较
        temp = this.array[i];
        j = i;
        // 4. 只要大于标记元素的值,就继续往前面找,在列表范围内直到找到不比标记元素的值大的位置。
        while(this.array[j - 1] > temp && j > 0){
    
    
            this.array[j] = this.array[j - 1];
            j--;
        }

        // 5. 将标记元素插入
        this.array[j] = temp;
    }
}

La eficiencia de la ordenación por inserción
Aunque el número de comparaciones e intercambios en el peor de los casos es N * (N-1) / 2 (veces);
sin embargo, el número promedio de veces es solo la mitad del total de elementos de datos (N * (N -1) / 4) Se requieren comparaciones e intercambios, es decir, la suma de los tiempos de comparación e intercambio del tipo de inserción es igual al número de comparaciones del tipo de selección;
por lo tanto, el número de comparaciones e intercambios del tipo de inserción es generalmente se considera mejor que el ordenamiento por burbujas y la selección. Los ordenamientos son pequeños, por lo que se considera que el ordenamiento por inserción es más eficiente en la ejecución que el ordenamiento por burbujas y el ordenamiento por selección.

La complejidad del tiempo es O (N 2 )

Optimización ¡
Hacia algoritmos avanzados!

para resumir

Los algoritmos de clasificación se pueden utilizar en muchas situaciones. Por ejemplo, el precio de la lista se clasifica en orden ascendente o descendente, o se puede clasificar por ventas ...
Comprender los algoritmos de clasificación simples es el requisito previo para comprender los algoritmos de clasificación avanzados y aprender Los algoritmos de clasificación avanzados deben ser incompletos. Es demasiado para soportar, ¡así que sienta las bases para ingresar al algoritmo de clasificación avanzado! ---- "[Estructura y algoritmo de datos JS] Implementación de algoritmos de clasificación Hill y clasificación rápida (se actualizará)

Supongo que te gusta

Origin blog.csdn.net/weixin_42339197/article/details/102907562
Recomendado
Clasificación