[Clase reducida del algoritmo de habla] Prueba de la corrección de la combinación y la clasificación y el análisis de la complejidad del tiempo (revisado el 25 de septiembre de 2020)

template<class _Ty> void merge(_Ty* _begin, _Ty* _mid, _Ty* _end) {
    
    
	const auto l = _end - _begin + 1;
	_Ty* t = new _Ty[l], * i = _begin, * j = _mid + 1, * k = t;
	while (i <= _mid && j <= _end) {
    
    
		if (*i <= *j) {
    
     *k = *i; ++i; ++k; }
		else {
    
     *k = *j; ++j; ++k; }
	}
	while (i <= _mid) {
    
     *k = *i; ++i; ++k; }
	while (j <= _end) {
    
     *k = *j; ++j; ++k; }
	std::copy(t, t + l, _begin);
	delete[] t;
}
template<class _Ty> void merge_sort(_Ty* _begin, _Ty* _end) {
    
    
	if (_begin < _end) {
    
    
		_Ty* _mid = _begin + (_end - _begin) / 2;
		merge_sort(_begin, _mid);
		merge_sort(_mid + 1, _end);
		merge(_begin, _mid, _end);
	}
}

La clasificación por fusión es un algoritmo de clasificación que adopta la idea de dividir y conquistar. Para realizar la ordenación por fusión es necesario llamar a la función merge_sort, que se divide en tres procesos:
· Divide la secuencia en dos partes.
· Combina y ordena de forma recursiva las dos subsecuencias.
La condición de terminación recursiva es que la longitud de la subsecuencia sea 1 o 0. Cuando la longitud es 1, los tres bucles while de la función merge no se pueden ingresar y la llamada recursiva regresa directamente; cuando la longitud es 0, la función merge_sort regresa directamente y no se llamará a la función merge.
· Fusionar dos subsecuencias. El proceso de fusión es:
establecer una secuencia temporal t para fusionar.
Los punteros i y j apuntan al comienzo de las dos submatrices respectivamente. El rango de la subsecuencia es _begin a _mid, _mid + 1 a _end.
Toma constantemente un elemento de cada una de las dos submatrices (es decir, los elementos apuntados por los punteros i y j) para comparar, coloca el número más pequeño en la matriz t, y el puntero correspondiente se incrementa (cuando los dos elementos son igual, la dirección se compara de forma predeterminada El número en la matriz inferior, es decir, el número al que apunta i se pone en t). Cuando se elimina una de las subsecuencias, el ciclo finaliza.
Copie todos los elementos de la subsecuencia cuyos elementos no se han llevado a la secuencia t.

Aquí usamos el esquema de ordenamiento recursivo de dividir la matriz en dos partes iguales tanto como sea posible, y luego fusionar las dos partes ordenadas. La corrección del proceso de fusión se demuestra de la siguiente manera:
De la condición de terminación recursiva anterior: antes de que comience la fusión, la longitud de todas las matrices es 1.
Al fusionar una matriz con longitud 1 y una matriz con longitud n, coloque el único elemento a de la matriz con longitud 1 en t, o coloque todos los elementos de la matriz con longitud n que no sean mayores que un primer Poner en t . Por lo tanto, siempre puede obtener una matriz ordenada con una longitud de n + 1.
Cuando se fusionan dos matrices ordenadas, el primer ciclo while siempre coloca las dos matrices de pequeña a grande en la matriz t primero. Cuando todos los números en una matriz se colocan en t, ya que los números restantes en la otra matriz están en orden, siempre que estos números se copien directamente en la matriz temporal t, puede obtener una longitud de una de las dos matrices que participan en la combinación. El conjunto más grande de sumas, y está ordenado.
Lo siguiente demuestra: Cualquier matriz de longitud n (n> 1) se fusiona a partir de dos matrices con longitudes 1 y n - 1, o se fusiona a partir de dos matrices con longitudes mayores que 1, pero se debe ordenar. El primer caso se ha probado anteriormente, y luego el segundo caso se prueba por contradicción.
Suponga que una matriz de longitud n (n> 1) se fusiona a partir de dos matrices con longitudes mayores que 1, pero una o dos matrices están desordenadas. Verifique el proceso de fusión de la matriz desordenada: siempre que se fusionen las dos matrices de la matriz desordenada, una de las longitudes sea mayor que 1, y luego se examinará el proceso de fusión de las matrices que participan en la fusión de la matriz desordenada . Dado que una matriz está desordenada, significa que al menos parte de ella está desordenada. Después de esta deducción hacia atrás, encontramos que esta parte de la matriz desordenada continúa retrocediendo y encontramos que al menos una matriz de longitud 1 está involucrada en la fusión en su origen. Pero se ha demostrado que en este caso, la matriz fusionada con este código debe estar en orden. Para la fusión continua de dos matrices ordenadas, también se ha demostrado que el resultado fusionado está ordenado. Esto crea una contradicción, por lo que esta proposición solo puede establecerse.
Por lo tanto, los elementos que entran en la secuencia t son siempre de pequeños a grandes. QED.

La complejidad de tiempo de la ordenación por fusión se analiza a continuación.
Suponga que la complejidad de tiempo de la ordenación por fusión es T (n), y n es la longitud de la matriz que se va a ordenar.
Es fácil ver que la profundidad del árbol de recursividad es ceil (log⁡n). Cuando cada capa del árbol recursivo está llena (es decir, n es una potencia entera de 2), la complejidad de tiempo aportada por cada capa es la más grande (correspondiente a la complejidad de tiempo de la operación de fusión), alcanzando O (n).
Entonces T (n) = O (n log⁡n).
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/COFACTOR/article/details/108570623
Recomendado
Clasificación