Ordenar la inserción
La ordenación por inserción funciona como muchas personas dispuestas en una mano y jugando a las cartas. Inicialmente, la mano izquierda está vacía y la siguiente carta boca sobre la mesa. Entonces, cada vez que tomamos una tarjeta de la mesa y la inserta en la posición correcta en la mano izquierda. Para encontrar la ubicación correcta de una tarjeta, de derecha a izquierda, vamos a compararlo con cada tarjeta ya en la mano, como se muestra en la Fig.
la implementación del código
plantilla < clase T>
void InsertionSort (T a [], int nums) {
para ( int i = 1 ; i <nums; i ++ ) {
tecla T = a [i];
int j = i - 1 ;
mientras que (j> = 0 && un [j]> clave) {
a [j + 1 ] = a [j];
j - ;
}
Un [j + 1 ] = clave;
}
}
Divide y vencerás
Muchos algoritmos útiles en la estructura recursiva es: con el fin de resolver un problema dado, uno o varios algoritmos llama a sí misma recursivamente para resolver un número de sub-temas estrechamente relacionados. Estos algoritmos suelen seguir la idea de dividir y conquistar: el problema original en varios de menor escala, pero similar al problema original de sub-problemas, para resolver estos problemas parciales de forma recursiva, y luego combinar las soluciones de estos sub-temas para establecer la solución problema original .
Partición en cada modelo recursivo tiene tres pasos :
- Descomponer el problema original en varias sub-problemas, estos sub-problemas son ejemplos más pequeñas del problema original.
- Resolver estos sub-problemas, de forma recursiva resolver cada subproblema. Entonces, si el tamaño de los sub-problemas es lo suficientemente pequeño, solución directa.
- El combinado solución de estos sub-solución del problema al problema original.
tipo de combinación de algoritmo en plena conformidad con el modo de sub-regla. Intuitivamente funciona como sigue:
- Descomposición : La secuencia tiene n elementos a clasificar en dos sub-secuencias que tienen cada una N / 2 elementos.
- Solución : ordenamiento por mezcla de forma recursiva dos secuencias alineadas.
- Combinar : combinar dos secuencias ordenadas.
Cuando la longitud de la secuencia que ser resuelto es 1, recursiva "comenzó a subir," no hacer ningún trabajo en este caso, debido a que la longitud de cada secuencia han sido ordenados.
la implementación del código
plantilla < clase T>
void Merge (T a [], int p, int q, int r) {
int n1 = q - p + 1 , n2 = r - q;
T * izquierda = nueva T [n1 + 1 ], * derecha = nueva T [n2 + 1 ];
para ( int i = 0 ; i <n1; i ++ ) {
izquierda [i] = a [p + i];
}
Izquierda [n1] = max;
para ( int i = 0; i <n2; i ++ ) {
derecha [i] = a [q + i + 1 ];
}
Derecho [n2] = max;
int i = 0 , j = 0 ;
para ( int k = p; k <= r; k ++ ) {
si (a la izquierda [i] < derecho [j]) {
a [k] = Izquierda [i];
i ++ ;
}
Más {
a [k] = derecha [j];
j ++ ;
}
}
}
Plantilla< Clase T>
void mergesort (T a [], int p, int r) {
si (p < r) {
int q = (p + r) / 2 ;
Mergesort (a, p, q);
Mergesort (a, q + 1 , r);
Combinar (a, p, q, r);
}
}