Estrutura de dados: algoritmo de classificação comum (oito): classificação por mesclagem (implementação C ++)

Estrutura de dados: algoritmo de classificação comum (8): classificação por mesclagem

(1) Ideia básica:

O método de classificação Merge (Merge) é mesclar duas (ou mais) listas ordenadas em uma nova lista ordenada, ou seja, dividir a sequência a ser classificada em várias subseqüências, e cada subseqüência é ordenada. Então, as subsequências ordenadas são mescladas na sequência ordenada geral. Na segunda etapa da classificação por mesclagem, as regras para classificar duas matrizes ordenadas são muito simples. Ao mesmo tempo, compare o tamanho da primeira posição das duas matrizes, coloque a menor em uma matriz vazia e, em seguida, coloque a posição na matriz vazia. O ponteiro se move para trás e continua a comparar com a posição anterior de outra matriz e assim por diante. Até que qualquer um dos arrays seja retirado da pilha primeiro, todos os elementos do outro array são acrescentados ao novo array.

A classificação mesclada e a classificação rápida têm o mesmo efeito. Classificação rápida: primeiro classifique a matriz em duas submatrizes e, em seguida, divida-a recursivamente em duas submatrizes até que haja apenas um elemento na submatriz, então ele será classificado naturalmente Ele pode ser resumido como classificação primeiro e depois recursiva; classificação por mesclagem: não importa o que aconteça, a matriz é dividida em duas submatrizes e a matriz é dividida em duas submatrizes recursivamente, até que haja apenas um elemento na matriz, então a classificação começa. Deixe os dois arrays serem classificados e, em seguida, classifique-os de acordo com o retorno recursivo. No final, o array inteiro pode ser classificado.

(2) Exemplos

Exemplo: a [15] = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48} Classificar por classificação por mesclagem

img

2.1 Método iterativo

① Aplique o espaço para fazer o tamanho da soma de duas sequências classificadas, este espaço é usado para armazenar a sequência mesclada

② Defina dois ponteiros, as posições iniciais são as posições iniciais das duas sequências classificadas, respectivamente

③ Compare os elementos apontados pelos dois ponteiros, selecione um elemento relativamente pequeno, coloque-o no espaço de mesclagem e mova o ponteiro para a próxima posição

④ Repita a etapa ③ até que um ponteiro alcance o final da sequência

⑤ Copie todos os elementos restantes de outra sequência diretamente para o final da sequência mesclada

2.2 Recursão

① Combine cada dois números adjacentes na sequência para formar sequências de piso (n / 2). Após a classificação, cada sequência contém dois elementos

② Combine as sequências acima novamente para formar sequências de base (n / 4), cada sequência contém quatro elementos

③ Repita a etapa ② até que todos os elementos sejam classificados

Código de exemplo:

// 归并排序(递归法)
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. Resumo:

Complexidade de tempo: a classificação de mesclagem é principalmente dividida em divisão e classificação de matrizes ordenadas. A complexidade de tempo da operação de divisão é logn, e a complexidade de classificação é n, então a complexidade de tempo da classificação de mesclagem é O (nlogn) merge sort A complexidade do espaço de é o espaço ocupado pelo array temporário e os dados colocados na pilha durante a recursão: n + logn, então a complexidade do espaço é O (n)

Acho que você gosta

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