Estructura de datos: algoritmo de clasificación común (ocho): clasificación por fusión (implementación de C ++)

Estructura de datos: algoritmo de clasificación común (8): clasificación por fusión

(1) Idea básica:

El método de clasificación Fusionar (Fusionar) consiste en fusionar dos (o más) listas ordenadas en una nueva lista ordenada, es decir, dividir la secuencia que se va a clasificar en varias subsecuencias, y cada subsecuencia está ordenada. Luego, las subsecuencias ordenadas se fusionan en la secuencia ordenada general. En el segundo paso de la clasificación por combinación, la regla para clasificar dos matrices ordenadas es muy simple. Al mismo tiempo, compare el tamaño de la primera posición de las dos matrices, coloque la más pequeña en una matriz vacía y luego coloque la posición en la matriz vacía. El puntero mueve uno hacia atrás y luego continúa comparando con la posición anterior de otra matriz, y así sucesivamente. Hasta que cualquiera de las matrices se extraiga primero de la pila, todos los elementos de la otra matriz se añaden a la nueva matriz.

La clasificación combinada y la clasificación rápida tienen el mismo efecto. Clasificación rápida: primero clasifique aproximadamente la matriz en dos submatrices, luego divida de manera recursiva y aproximada las dos submatrices hasta que solo haya un elemento en la submatriz, luego se ordenará de forma natural. Se puede resumir como clasificación primero y luego recursiva; clasificación por fusión: no importa qué, la matriz se divide en dos submatrices y la matriz se divide en dos submatrices de forma recursiva, hasta que solo hay un elemento en la matriz, luego comienza la clasificación. Ordene las dos matrices en orden y ordene las dos matrices a su vez de acuerdo con el retorno recursivo. Al final, puede ordenar toda la matriz.

(2) Ejemplos

Ejemplo: a [15] = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48} Ordenar por orden combinado

img

2.1 Método iterativo

① Solicite espacio para hacer que el tamaño sea la suma de dos secuencias ordenadas. Este espacio se usa para almacenar la secuencia combinada

② Establezca dos punteros, las posiciones iniciales son las posiciones iniciales de las dos secuencias ordenadas respectivamente

③ Compare los elementos apuntados por los dos punteros, seleccione un elemento relativamente pequeño y colóquelo en el espacio de fusión, y mueva el puntero a la siguiente posición

④ Repita el paso ③ hasta que un puntero llegue al final de la secuencia

⑤ Copie todos los elementos restantes de otra secuencia directamente al final de la secuencia combinada

2.2 Recurrencia

① Combine cada dos números adyacentes en la secuencia para formar secuencias de piso (n / 2). Después de ordenar, cada secuencia contiene dos elementos

② Fusionar las secuencias anteriores nuevamente para formar secuencias de piso (n / 4), cada secuencia contiene cuatro elementos

③ Repita el paso ② hasta que todos los elementos estén ordenados

Código de ejemplo:

// 归并排序(递归法)
template<typename T>
void merge_sort_recursive(T arr[], T reg[], int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    merge_sort_recursive(arr, reg, start1, end1);
    merge_sort_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2)
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
    while (start1 <= end1)
        reg[k++] = arr[start1++];
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}

// merge_sort
template<typename T>
void merge_sort(T arr[], const int len) {
    T reg[15];
    merge_sort_recursive(arr, reg, 0, len - 1);
}

3. Resumen:

Complejidad de tiempo: la clasificación por fusión se divide principalmente en la división y la clasificación de matrices ordenadas. La complejidad del tiempo de la operación de división es logn y la complejidad de la clasificación es n, por lo que la complejidad del tiempo de la clasificación por fusión es O (nlogn). La complejidad del espacio de es el espacio ocupado por la matriz temporal y los datos insertados en la pila durante la recursividad: n + logn, por lo que la complejidad del espacio es O (n)

Supongo que te gusta

Origin blog.csdn.net/qq_43801020/article/details/108219886
Recomendado
Clasificación