Introdução aos princípios de classificação rápida
A classificação rápida é uma atualização de classificação de bolhas que aprendemos antes. Todos pertencem à classificação de troca, e todos usam comparação e movimento constantes para alcançar a classificação. A classificação rápida é um algoritmo de classificação muito eficiente. Sua implementação aumenta a distância entre a comparação e o movimento dos registros e move registros com palavras -chave maiores diretamente da frente para a parte traseira e registra com palavras -chave menores diretamente da parte traseira para a frente, reduzindo assim o número total de comparações e movimentos. Ao mesmo tempo, a idéia de "dividir e conquistar" é adotada para dividir o grande em pequeno e os pequenos em menores. O princípio é o seguinte: para um determinado conjunto de registros, selecione um elemento de referência, geralmente o primeiro elemento ou o último elemento é selecionado e, através de uma varredura, a sequência a ser classificada é dividida em duas partes, parte menor que o elemento de referência e parte maior ou igual ao elemento de referência. Nesse momento, o elemento de referência está na posição correta após a classificação e, em seguida, as duas partes são recursivamente classificadas da mesma maneira até que todos os registros da sequência sejam encomendados.
1. O menor número de k
Digite n números para encontrar os menores números K, por exemplo, digite 4,5,1,6,2,7,3,8, e o menor número é 1,2,3,4
Com base em O (n), esse problema pode ser resolvido usando a função de parção. Se o kth número da matriz for ajustado com base no número Kth, para que todos os números menores que o Kth Number estejam localizados à esquerda da matriz, e todos os números maiores que o Kth Array estarão localizados à direita da matriz. Após o ajuste, os números K à esquerda da matriz são os menores números de K, que não são necessariamente ordenados.
importar java.util.scanner; public classe principal {public static void main (string [] args) {scanner in = new scanner (system.in); int n = in.nextInt (); int k = in.nextnt (); int [] num = new int [n]; int [] out = new Int [k]; i = 0; i <n; i ++) {num [i] = in.nextInt ();} boolean b = getMink (n, num, k, out); if (b) {for (int i = 0; i <k; i ++) {System.out.print (out [i]+") int uik, int [] PoutputArray) {if (pinputArray == null || poutputArray == null || uik> uiinputnum || uiinputNum <= 0 || uik <= 0) {return false;} int = 0; int = end = uiinputNum-1; int index = Partition = Partition (Partition; while (index! = uik-1) {if (index> uik-1) {// index está no lado direito do k-1 end = index-1; index = partition (pinputArray, start, end);} else {start = index+1; index = partition (pinputArray, start, end);}} para (int) i = 0; i <uik; i ++) {PoutputArray [i] = pinputArray [i];} retorna true;} // função de partição de partição retorna o valor do índice da linha rápida do primeiro elemento do Array A INDEX A Public Int Partition (int [] a, int, int end) {int privat = a []; j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); enquanto (i <j && privot> = a [i]) {i ++;} troca (a, i, j);} retorna i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j] a [j] = t; t;}} 2. Números com mais da metade das ocorrências na matriz
Há um número na matriz que aparece mais da metade do comprimento da matriz. Por favor, encontre este número. Por exemplo, 1, 2, 3, 2, 2, 5, 4, 2, o número 2 aparece 5 vezes na matriz, excedendo metade do comprimento da matriz, saída 2
Inspirado na classificação rápida, em classificação rápida, agora selecione um número na matriz e ajuste a ordem dos números na matriz para que os números menores que o número selecionado sejam classificados à sua esquerda e os números maiores que o número selecionado são classificados à sua direita.
Se o subscrito do número selecionado for N/2, esse número é o número mediano na matriz
importar java.util.scanner; public classe principal {public static void main (string [] args) {scanner in = new scanner (system.in); int n = in.nextInt (); int [] num = new int [n]; para (int i = 0; i <n; i ++) b = gethalfnum (n, num); if (b! = -1) {System.out.println (b);}} public static int gethalfnum (int uiInputNum, int [] pinputArray) {if (pinputArray == null || uiinputinum <= 0) {retorno -1; start = 0; int end = uiinputNum-1; int index = partition (pinputArray, start, end); Enquanto (index! = Médio) {// Se não for igual a metade do comprimento, significa que a mediana não é encontrada se (índice> meio) {end = index-1; index = partition (PinputArray, start, end);} else {start = index+1; index = Partition (PinputArray, start, end);}} {retirtAnTray] 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); enquanto (i <j & privot> = a [i]) {i ++;} troca (a, i, j);} retorna i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j] a [j] = t;}} 3. Encontre o menor número do menor na matriz
Por exemplo, dada a matriz 1, 5, 2, 6, 8, 0, 6, o 4º menor número é 5
importar java.util.scanner; public classe principal {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]; para (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 uinputNum, int [] uik) {if (pinputArray == null || uik> uiInputNum || uiinputnum <= 0 || uik <= 0) {return -1;} int start = 0; int end = uiinp. enquanto (index! 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); enquanto (i <j & privot> = a [i]) {i ++;} troca (a, i, j);} retorna i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j] a [j] = t;}}Resumir
O exposto acima é o conteúdo inteiro deste artigo sobre o código de exemplo de três perguntas do algoritmo com base na classificação rápida da programação Java. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!