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
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)