Introducción a los principios de clasificación rápida
La clasificación rápida es una actualización de la clasificación de burbujas que aprendimos antes. Todos pertenecen a la clasificación de intercambio, y todos utilizan la comparación constante y el movimiento para lograr la clasificación. La clasificación rápida es un algoritmo de clasificación muy eficiente. Su implementación aumenta la distancia entre la comparación y el movimiento de los registros, y mueve registros con palabras clave más grandes directamente de la parte delantera a la parte posterior, y los registros con palabras clave más pequeñas directamente desde la parte posterior al frente, reduciendo así el número total de comparaciones y movimientos. Al mismo tiempo, se adopta la idea de "dividir y conquistar" para dividir lo grande en pequeños y los pequeños en los más pequeños. El principio es el siguiente: para un conjunto dado de registros, seleccione un elemento de referencia, generalmente se selecciona el primer elemento o el último elemento, y a través de un escaneo, la secuencia que se clasificará se divide en dos partes, parte más pequeña que el elemento de referencia, y parte mayor o igual que el elemento de referencia. En este momento, el elemento de referencia está en la posición correcta después de que se clasifica, y luego las dos partes se clasifican recursivamente de la misma manera hasta que se ordenan todos los registros en la secuencia.
1. El menor número de k
Ingrese N los números para encontrar los números K más pequeños, por ejemplo, ingrese 4,5,1,6,2,7,3,8, y el número más pequeño es 1,2,3,4
Basado en O (N), este problema se puede resolver utilizando la función de Parte. Si el número KTH de la matriz se ajusta en función del número KTH, de modo que todos los números más pequeños que el número KTH se encuentran a la izquierda de la matriz, y todos los números más grandes que la matriz KTH se encuentran a la derecha de la matriz. Después del ajuste, los números K a la izquierda de la matriz son los números K más pequeños, que no se ordenan necesariamente.
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextint();int k=in.nextint();int[] num=new int[n];int[] out=new int[k];for (int i = 0; i <n; i ++) {num [i] = in.nextInt ();} boolean b = getMink (n, num, k, out); if (b) {para (int i = 0; i <k; i ++) {system.out.pint (out [i]+"");}} pública boolean getMink (int uiiinmin, intugury, intuteput, intittent, intugury, intenttent, int uik, int [] PoutPutArray) {if (pinputArray == null || poutputArray == null || uik> uiinputnum || uiinputnum <= 0 || uik <= 0) {return false;} int inicio = 0; int end = uiinputnum-1; int index = Partition (Pinputray, start, end); while(index!=uiK-1){if(index>uiK-1){//index is on the right side of k-1 end=index-1;index=partition(pInputArray,start,end);} else{start=index+1;index=partition(pInputArray,start,end);}}for (int i=0;i<uiK;i++){pOutputArray[i]=pInputArray[i];}return true;}//partition partition function returns the index value of the quick row of the first element of array a index public static int partition(int[] a,int start,int end){int privot=a[start];int i=start;int j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); while (i <j && privot> = a [i]) {i ++;} swap (a, i, j);} return i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j]; a [j] = t;}} 2. Números con más de la mitad de los ocurrencias en la matriz
Hay un número en la matriz que aparece más de la mitad de la longitud de la matriz. Encuentre este número. Por ejemplo, 1, 2, 3, 2, 2, 5, 4, 2, el número 2 aparece 5 veces en la matriz, superior a la mitad de la longitud de la matriz, salida 2
Inspirado en un sort Quick, en un tipo rápido, ahora seleccione un número en la matriz y luego ajuste el orden de los números en la matriz para que los números más pequeños que el número seleccionado se clasifiquen a su izquierda y los números más grandes que el número seleccionado se clasifican a su derecha.
Si el subíndice del número seleccionado es N/2, entonces este número es el número medio en la matriz
import java.util.scanner; public class Main {public static void main (string [] args) {Scanner in = new Scanner (System.in); int n = in.nextInt (); int [] num = new int [n]; for (int i = 0; i <n; i ++) {num [i] = in.nextint ();} int b = gethalfnum (n, num); if (b! = -1) {system.out.println (b);}} public static int gethalfnum (int uiinputnum, int [] pinputArray) {if (pinputArray == null || uiinputnum <= 0) {return -1;} int Middle = uiiNumnum >> 1; start = 0; int end = uiInputNum-1; int index = particion (pinputArray, start, end); Mientras (index! = Middle) {// si no es igual a la mitad de la longitud, significa que la mediana no se encuentra si (index> middle) {end = index-1; index = partition (pinputArray, start, end);} else {start = index+1; index = partition (pinputArray, inicio, end);}} return-pinputarra inicio, int end) {int privot = a [inicio]; int i = start; int j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); while (i <j & privot> = a [i]) {i ++;} swap (a, i, j);} return i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j]; a [j] = t;}} 3. Encuentra el número más pequeño de KTH en la matriz
Por ejemplo, dada la matriz 1, 5, 2, 6, 8, 0, 6, el cuarto número más pequeño es 5
import java.util.scanner; public class Main {public static void main (string [] args) {Scanner in = new Scanner (System.in); int n = in.nextInt (); int k = in.nextInt (); int [] num = new int [n]; // int [] out = new int [k]; for (int i = 0; i <n; i ++) {num [i] = in.nextInt ();} int b = getMink (n, num, k); if (b! =-1) {system.out.println (b);}} public static int getMink (int uiinputnum, int uik) {if (pinputArray == null || uik> uiinputnum || uiinputnum <= 0 || uik <= 0) {return -1;} int inicio = 0; int end = uiInputNum -1; int index = PARTITION (pinputArray, inicio, end); while (index! = uik-1) {// si el índice no es la posición de k-1 if (index> uik-1) {end = index-1; index = partition (pinputArray, start, end);} else {start = index+1; index = partition (pinputray, inicio, inicio, end);}} return-; end) {int privot = a [start]; int i = start; int j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); while (i <j & privot> = a [i]) {i ++;} swap (a, i, j);} return i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j]; a [j] = t;}}Resumir
Lo anterior es todo el contenido de este artículo sobre el código de ejemplo de tres preguntas de algoritmo basadas en una clasificación rápida de programación Java. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!