Preguntas urgentes de la entrevista sobre Java. Gracias.
El código de implementación es el siguiente:
# include & ltstdio.h & gt
#Include "common.h"
fusión vacía (int datos [], int p, int q, int r)
{
int i, j, k, n1, N2;
n 1 = q-p+1;
N2 = r-q;
int L[n 1];
int R[N2];
for(i=0,k=p;i<n1;i++,k++)
l[I]= datos[k];
for(i=0, k = q+1;i<N2;i++,k++)
r[I]= datos[k];
for(k=p,i=0,j= 0; i<n1.&j<N2;k++)
{
if(L[I]& gt;R[j])
{
datos[k]= L[I];
i++;
}
Otros
{
datos[k]= R[j];
j++;
}
}
Si (i & ltn 1)
{
for(j = I;j & ltn 1;j++,k++)
datos[k]= L[j ];
}
if(j & lt;n2)
{
for(I = j;i<N2; i++, k++)
datos[k]= R[I];
}
}
void merge_sort(int datos[ ], int p, int r)
{
Si (p & ltr)
{
int q =(p+ r)/2
;merge_sort(datos, p, q);
merge_sort(datos, q + 1, r);
merge(datos, p, q, r);
p>}
}
void test_merge_sort()
{
int datos[] = {44, 12, 145, -123, -1, 0, 121};
printf(" -merge sort-\ n ");
out_int_array( datos, 7
);merge_sort(datos, 0, 6);
out_int_array(datos, 7
}
int main()
<); p>{test_merge_sort().
Devuelve 0;
}
4. Para una tabla lineal con n nodos (e0, e1,..., en-1), reorganice los lineal El proceso de los nodos de la tabla se llama clasificación. Los elementos de datos a los que se hace referencia durante la clasificación se denominan códigos de clasificación y el valor clave del nodo generalmente se selecciona como código de clasificación.
Si los nodos con códigos de clasificación iguales en la tabla lineal se clasifican de acuerdo con un determinado método de clasificación, el orden relativo antes de la clasificación aún se puede mantener, lo que se denomina estable; de lo contrario, se dice que este método de clasificación es estable; ser inestable.
Durante el proceso de clasificación, todos los nodos de la tabla lineal están en la memoria y su orden de almacenamiento en la tabla lineal se ajusta en la memoria. Esta es la llamada clasificación interna. Durante el proceso de clasificación, solo algunos nodos de la tabla lineal se transfieren a la memoria, y el método de clasificación para ajustar el orden de almacenamiento de los nodos en la memoria externa con la ayuda de la memoria se convierte en clasificación externa.
La siguiente tabla presenta brevemente varios métodos de clasificación interna comunes y compara sus características de rendimiento.
Método de clasificación
Introducción
Tiempo solar medio
Peor caso
Almacenamiento auxiliar
¿Es estable?
Método de clasificación simple
Método de clasificación por selección
Seleccione repetidamente el nodo con el valor clave más pequeño de la parte sin clasificar de la tabla lineal, en el orden seleccionado la tabla lineal Organice los nodos para formar una lista lineal nuevamente. Hasta que la parte sin clasificar esté vacía, la lista lineal reconstruida es una lista lineal ordenada.
o()
o()
O(1)
Volatil
Clasificación por inserción directa
Supongamos que la primera secuencia de nodos I e0, e1,..., en-1 de la tabla lineal está ordenada. Encuentre la posición de inserción del nodo en esta secuencia ordenada de nodos ei, inserte ei, de modo que la secuencia de nodos i + 1 e0, e1,..., ei también quede ordenada. Realice dichos pasos de inserción para i = 1, 2,..., n-1 en secuencia y finalmente logre la clasificación de la tabla lineal.
o()
o()
O(1)
Estable
Clasificación de burbujas p>
Para todos los nodos actualmente sin ordenar en el rango, compare y ajuste los dos nodos adyacentes de arriba a abajo, de modo que el nodo con un valor clave grande se hunda y el nodo con un valor clave pequeño suba. Es decir, siempre que se comparan dos adyacentes y se descubre que su orden de disposición es opuesto al requisito de clasificación, se realiza un intercambio.
o()
o()
O(1)
Estable
Clasificación de conchas p>
Una mejora de la clasificación por inserción directa, también llamada "clasificación incremental reductora". Primero, toda la columna a ordenar se divide en varias subsecuencias para la clasificación por inserción directa. Cuando los registros de toda la secuencia están "básicamente en orden", todos los registros se insertan y ordenan directamente nuevamente.
Qianniu
o()
o(Iniciar sesión)
Volatil
Clasificación rápida
Mejora esencial del tipo de burbujas. A primera vista, la longitud de la secuencia a ordenar se puede reducir considerablemente. Después de un vistazo, mueva un nodo a la derecha del centro de modo que el valor clave del nodo en la secuencia a su izquierda sea menor que el suyo, y el valor clave del nodo en la secuencia a su derecha no sea menor que el suyo. Llame a esa mirada un "maestro". Cada división convierte una secuencia larga en dos nuevas subsecuencias más pequeñas, y las dos subsecuencias más pequeñas se dividen en partes iguales hasta que la longitud de la nueva subsecuencia sea 1. Cuando la longitud de todas las subsecuencias es 1, la secuencia ya está ordenada.
O(nlogn)
o()
o(logn)
Volatil
Clasificación de montón
La ordenación por selección de árbol es una mejora efectiva en la ordenación por selección directa. El montón es un árbol binario almacenado en orden. Los valores clave de todos sus nodos principales (e [i]) no son menores que su nodo secundario izquierdo (e [2 * i + 1]) y su nodo secundario derecho (e). [2*i+2] ) valor clave. Inicialmente, si los n nodos de la secuencia a ordenar se consideran como un árbol binario almacenado en orden, su orden de almacenamiento se ajusta para que se conviertan en un montón, y luego el valor clave del nodo raíz del montón es el más grande. Luego, el nodo raíz se intercambia con el último nodo del montón, y los n-1 nodos a los que les falta un nodo se reajustan para convertirse en un montón nuevamente. De esta manera, el segundo valor más grande del valor clave de la secuencia de nodos se obtiene en el nodo raíz. Y así sucesivamente, hasta que solo queden dos nodos en el montón, intercámbielos y finalmente obtenga una secuencia ordenada de n nodos.
O(nlogn)
O(nlogn)
O(1)
Volatil
Fusionar categorías
Fusionar dos o más sublistas ordenadas en una nueva lista ordenada.
Para la clasificación combinatoria bidireccional en la que dos sublistas ordenadas se fusionan en una lista ordenada, al principio, se considera que la secuencia de n nodos que se va a ordenar consta de n sublistas ordenadas con una longitud de 1, y varias longitudes son se obtiene fusionándolos en secuencia. Una sublista ordenada de 2, y luego fusionada en pares... hasta que se obtiene una lista ordenada de longitud n y se completa la clasificación.
O(nlogn)
O(nlogn)
O(n)
Estable
Retroceder La implementación del lenguaje C se basa en varios algoritmos de clasificación. Puede consultarlo al revisar.
clasificación u-selectiva
void ss_sort(int e[], int n)
{ int i, j, k, t
;for(I = 0;i<n-1;i++) {
for(k=i,j=I+1;j<n;j++)
si(e[ k]& gt;e[j])k = j;
Si (k!=i) {
t = e[I];e[ I]= e[ k]; e[k]= t;
}
}
}
uOrdenación por inserción directa
void si_sort(int e[], int n)
{ int i, j, t
for(I = 0; i<n; i++) {
For (t=e[i], j = I-1; j & gt= 0 & amp& ampt & lte[j]; j -)
e [j+1]= e[ j];
e[j+1]= t;
}
}
clasificación de burbujas
void sb_sort(int e[], int n)
{ int j, p, h, t
for(h = n-1; h & gt0; h=; p) {
for(p = j = 0; j & lth; j++)
if(e[j]& gt; e[j+1]) { p>
t = e[j]; e[j]= e[j+1]; e[j+1]= t;
p = j;
}
}
}
Clasificación Hill tipo U
shell vacío( int e[], int n) p>
{ int j, k, h, y;
for(h = n/2; h & gt0; h=h/2)
for(j = h;j & ltn;j++) {
y = e[j];
for(k = j-h;k & gt0 & amp& ampy & lte[k];k -=h)
e[k+h]= e[k];
e[k+h]= y;
}
}
uHeap sort
Filtro no válido (e, n, s)
int e []; n;
int s;
{ int t, k, j
t = e[s ];
k = s; j = 2 * k+1;
mientras(j & lt; n) {
if(j & lt; n-1 && ampe[j]< ;e[j+1])
j++;
if(t <e[j]) {
e[k]= e[j ];
k = j;
j = 2 * k+1
} más roto; >
e[k]= t;
}
heapsorp vacío (int e[], int n )
{ int i, k, t;
for(I = n/2-1;i>=0;i-)
tamizar (e, n, I);
for (k = n-1; k & gt=1;k - ) {
t = e[0]; e[0 ]= e[k]; p>
sift(e, k, 0);
}
}
uClasificación rápida
void r_quick(int e[], int bajo, int alto)
{ int i, j, t;
if(bajo<alto){
I = bajo; j = alto; t = e[bajo];
mientras(i<j) {
mientras(i<Johnson & Johnson.&e [j]>t)j -;
if(i<j)e[i++]= e[j];
mientras(i<Johnson & Johnson.& ampe[I]<= t)i++; p>
si (i<j)e[j-]= e[I];
}
e[I]= t;
r_quick (e, baja, I-1);
r_quick(w, i+1, alta);
}
}
Además, la clasificación externa es la clasificación de archivos grandes y los registros que se van a clasificar se almacenan en la memoria externa. Durante el proceso de clasificación, solo una parte de los registros del archivo se almacena en la memoria y todo el proceso de clasificación requiere múltiples intercambios entre la memoria interna y externa.
* * *Búsqueda
La búsqueda consiste en encontrar nodos que cumplan condiciones específicas en un conjunto de datos almacenado en una determinada estructura de datos.
Según las condiciones de búsqueda, existen códigos clave de nodos, elementos de datos distintos de los códigos clave o combinaciones de otros elementos de datos. Según los datos de búsqueda en la memoria o en la memoria externa, se puede dividir en búsqueda en memoria y búsqueda en memoria externa. Según el propósito de la búsqueda, si la búsqueda solo determina la existencia de nodos con condiciones específicas, se convierte en una búsqueda estática, la búsqueda es para determinar la posición de inserción de un nodo o eliminar el nodo encontrado. búsqueda dinámica.
La siguiente es una breve introducción a varios métodos de búsqueda comunes.
Buscar en una tabla lineal almacenada secuencialmente
Este es el método de búsqueda más común. El conjunto de nodos se organiza en forma de lista lineal y se almacena secuencialmente. Los nodos solo contienen códigos clave, que son números enteros. Si la lista lineal está desordenada, se utiliza la búsqueda secuencial, es decir, buscar uno por uno comenzando desde un extremo de la lista lineal. Si la lista lineal está ordenada, puede utilizar la búsqueda secuencial, la búsqueda binaria o la búsqueda por interpolación.
búsqueda de bloques u
El proceso de búsqueda de bloques se divide en dos pasos. Primero, utilice el método binario para encontrar el elemento de índice en la tabla de índice y determinar qué nodo buscar. Luego, busque secuencialmente en los bloques correspondientes.
La búsqueda de tablas lineales en el almacenamiento vinculado en U
La búsqueda de tablas lineales en la memoria vinculada solo se puede realizar de forma secuencial comenzando desde el primer nodo de la lista vinculada. De manera similar, las listas enlazadas desordenadas y las listas enlazadas ordenadas también tienen diferentes métodos de búsqueda.
Buscar en la tabla hash
La tabla hash, también llamada tabla hash, es una tecnología de búsqueda muy práctica. Su principio es establecer una relación definida entre la ubicación de almacenamiento de un nodo y su código clave, de modo que el código de búsqueda pueda utilizar directamente esta relación para determinar la ubicación del nodo. La clave de su tecnología reside en resolver dos problemas.
I.Encontrar una buena función hash