Clasis rápida, también conocida como división y clasificación de intercambio. Un algoritmo de clasificación rápida implementado con la estrategia de dividir y conquistar.
Este artículo habla principalmente sobre el uso de JavaScript para implementar una clasificación rápida de ideas en el lugar
Métodos de división y tratamiento:
En informática, el método de división y conquista es un paradigma de algoritmo muy importante basado en la recursión de múltiples ramas. La explicación literal es "dividir y conquistar", lo que significa dividir un problema complejo en dos o más subproblemas idénticos o similares hasta que el final del subproblema puede resolverse de manera simple y directa, y la solución del problema original es la fusión de las soluciones del subproblema. (Extracto de Wikipedia)
Idea de clasificación rápida
Especifique un elemento en la matriz como una regla, coloque el más grande que él y coloque el más pequeño que él antes del elemento, repita esto hasta que todos estén dispuestos en el orden positivo.
La clasificación rápida se divide en tres pasos:
Seleccione un punto de referencia: seleccione un elemento como punto de referencia en la estructura de datos (pivote)
Partición: consulte el tamaño del valor del elemento de referencia, divida el área desordenada. Todos los datos más pequeños que el elemento de referencia se colocan en un intervalo, y todos los datos más grandes que el elemento de referencia se colocan en otro intervalo. Después de completar la operación de partición, la posición del elemento de referencia es la posición donde debe estar después de la clasificación final.
Recursión: llame recursivamente a los algoritmos en el paso 1 y el paso 2 por primera vez hasta que solo quede un elemento en todos los intervalos no ordenados.
Ahora hablemos sobre los métodos de implementación comunes (no se usa algoritmo en el lugar)
función Quicksort (arr) {if (arr.length <= 1) return; // Por favor, el punto de referencia de dígitos más cercano al medio de la matriz, los números impares e incluso los números toman valores diferentes, pero no lo creo. Por supuesto, puede elegir el primer o último número como el punto de referencia, y no hay demasiada descripción aquí var pivotIndex = math.floor (arr.length/2); var pivot = arr.splice (pivotIndex, 1) [0]; // intervalos izquierdo e izquierdo se usan para almacenar números clasificados var izquierda = []; var rectil (var i = 0; i <arr.length; i ++) {console.log ('el' + (i + 1) + 'bucle de operación de partición:'); // Hay menos que la referencia, poner en el intervalo izquierdo, mayor que la referencia, poner en el intervalo correcto si (arr [i] <pivot) {izquierda.push (arr [i]); console.log ('izquierda: {right.push (arr [i]); console.log ('right:' + (arr [i]))}} // El operador concat se usa aquí para empalmar el intervalo izquierdo, la referencia y el intervalo derecho en una nueva matriz // luego recursivamente 1 y 2 pasos hasta que todos los intervalos no ordenados tienen solo un elemento a la izquierda, y el final de retorno recursivo recursivo (izquierda). Quicksort (derecha));} var arr = [14, 3, 15, 7, 2, 76, 11]; console.log (Quicksort (arr));/** Cuando la base es 7, la primera partición se obtiene con dos subconjuntos en la izquierda y derecha [3, 2,] 7 [14, 15, 76, 11];* Con la base es 2, la izquierda subspuso, 2] se enficiona y se clasifica y se clasifica y se clasifica y se clasifica y se clasifica y se clasifica y se clasifica. Toda la clasificación del subconjunto izquierdo termina* Con la referencia como 76, el subconjunto derecho se divide y se clasifica para obtener [14, 15, 11] 76* En este momento, el anterior [14, 15, 11] se divide y se clasifica a lo anterior [14, 15, 11] El anterior [14, 11] se divide y clasifica a lo anterior [11] se divide y clasifica a la base 11, 11 [14]*Solo queda un elemento en todos los intervalos no ordenados, y el extremo recursivo **/A través de la depuración del punto de interrupción, se pueden obtener los resultados.
Desventajas:
Requiere espacio de almacenamiento adicional de Ω (N), que es tan malo como la clasificación de fusión. En un entorno de producción, se requiere espacio de memoria adicional, que afecta el rendimiento.
Al mismo tiempo, muchas personas piensan que lo anterior es un tipo muy rápido. Por lo tanto, a continuación, es necesario recomendar la clasificación rápida del algoritmo en el lugar
Para obtener información sobre el algoritmo in situ, consulte Wikipedia. Los estudiantes que están debajo de la pared son similares a Baidu.
en el lugar
La clasificación rápida generalmente se implementa con recursión. Lo más importante es la función de segmentación de partición, que divide la matriz en dos partes, una es más pequeña que el pivote y el otro es más grande que el pivote. El principio específico se ha mencionado anteriormente
función QuickSort (arr) {// swap function swap (arr, a, b) {var temp = arr [a]; arr [a] = arr [b]; arr [b] = temp;} // Particion Function Partition (arr, izquierda, derecha) {/*** Al principio, no conoce la ubicación de almacenamiento de pivot final, puede vergotar a la parte posterior*aquí está directamente definido directamente el elemento de la referencia*. pivot = arr [right];/*** Al almacenar elementos más pequeños que los pivot, están al lado del elemento anterior, de lo contrario, el elemento almacenado en el espacio puede ser mayor que el pivote,* por lo tanto, una variable StoreIndex se declara e inicializa a la izquierda para almacenar elementos más pequeños que el pivote uno al lado del otro. */var storeIndex = left; for (var i = izquierda; i <right; i ++) {if (arr [i] <pivot) {/*** Traverse la matriz y encontrar el elemento más pequeño que los pivot, (elementos más grandes que Pivot se omitirán)* Poner el elemento obtenido cuando se enojan i tiempos para almacenar a través de swap. swapped*/swap(arr, storeIndex, i);storeIndex++;}}// Finally: swap pivot to storeIndex, place the benchmark element at the final correct position swap(arr, right, storeIndex);return storeIndex;}function sort(arr, left, right) {if (left > right) return;var storeIndex = partition(arr, left, right);sort(arr, left, storeIndex - 1); sort (arr, storeIndex + 1, derecha);} sort (arr, 0, arr.length - 1); return arr;} console.log (Quicksort ([8, 4, 90, 8, 34, 67, 1, 26, 17]));Optimización de partición
Los estudiantes cuidadosos aquí pueden preguntar si habrá un rendimiento diferente al seleccionar diferentes puntos de referencia. La respuesta es sí, pero porque soy una persona front-end y no sé mucho sobre el algoritmo, por lo que este pozo se deja a personas poderosas para llenar.
Complejidad
La clasificación rápida es el algoritmo de clasificación más rápido, y su complejidad de tiempo es O (log n)
En la situación promedio, el orden de N ítems requiere comparaciones de (n log n). En el peor de los casos, se requieren comparaciones de O (N2).
https://github.com/lyz0106/
Lo anterior es el método de clasificación rápida de las ideas en el lugar de implementación de JavaScript introducidas por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje. El editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin Network!