El principio de clasificación por fusión y la implementación del código fuente de C ++


1. Principio

Un algoritmo eficaz y estable basado en la operación de combinación, que utiliza el método de dividir y conquistar para ordenar primero cada subsecuencia y luego fusionar las subsecuencias ordenadas para obtener una secuencia completamente ordenada. Si dos listas ordenadas se combinan en una lista ordenada, se convierte en una combinación bidireccional.

Ordene la idea, uno se divide en dos, dos se divide en cuatro y cuatro se divide en ocho, hasta que la división sea la más pequeña; luego se fusionan gradualmente. Se adopta el método recursivo al dividir.


2. Pensando

Primero agrupe la secuencia original, divídala en múltiples subsecuencias, ordene cada subsecuencia, luego combine las subsecuencias por pares y ordene para obtener la nueva secuencia ordenada como la siguiente subsecuencia combinada, y luego coloque la nueva subsecuencia Fusionar .... Al final de este bucle, se obtiene una secuencia ordenada.
Inserte la descripción de la imagen aquí

Ejemplo:
fusionar y ordenar datos [1, 4, 2, 6, 7, 3, 5, 10, 9].

Estado inicial: 1, 4, 2, 6, 7, 3, 5, 10, 9

  1. Primera agrupación: {1,4}, {2,6}, {7,3}, {5,10}, {9}, después de fusionar, obtenemos {1,4}, {2,6}, {3 , 7}, {5,10}, {9}
  2. Segunda agrupación: {1,4,2,6}, {3,7,5,10}, {9}, después de fusionar, {1,2,4,6}, {3, 5,7,10}, {9}
  3. La tercera agrupación: {1,2,4,6,3, 5,7,10}, {9}, después de fusionar, obtenemos {1,2,3,4,5,6,7,10}, { 9}
  4. La cuarta agrupación: {1,2,3,4,5,6,7,10,9}, después de fusionar, obtenemos [1,2,3,4,5,6,7,9,10]

Tres, combinar características de clasificación

  • Clasificación estable, el orden de elementos iguales no cambiará. Por ejemplo, al ingresar el registro 1 (a) 3 (b) 2 (c) 2 (d) 5 (e) (la clave del registro está entre paréntesis), la salida 1 (a) 2 (c) 2 (d) 3 (b)) 2 y 2 en 5 (e) están en el orden de entrada. Esto es muy importante cuando los datos que se van a ordenar contienen información múltiple y deben ser ordenados por uno de ellos, y se requiere ordenar otra información. en el orden de entrada tanto como sea posible.

  • El número de comparaciones de clasificación por fusión es menor que el de clasificación rápida, y el número de movimientos es generalmente mayor que el de clasificación rápida.


Cuatro, implementación de código fuente C ++

Una vez completada la división, los datos divididos deben ordenarse. En este momento, la función de combinación tiene un total de 5 parámetros de
clasificación (int * data, int * temp, int start, int middle, int end); aquí el temporal se utiliza temp variable Como variable intermedia en los dos conjuntos ordenados, se sintetiza un conjunto.


void merge(int arr[], int *temp, int start, int middle, int end)
{
    
    
	int i=start, j=middle+1,k=start;
	
	while(i<=middle && j<=end)
	{
    
    
		if(arr[j] < arr[i])
		{
    
    
			temp[k++]=arr[j++];
		}
		else
		{
    
    
			temp[k++]=arr[i++]
		}
	}
/*
这里表示的是几集合2的数值已经先排序完成,集合1剩下有数据剩余,
这个时候直接把集合1剩余的数据直接插入到合集的后面,比如两个集合,
集合1:1 3 8 9,  集合2:2 4 6 7,集合1和集合2的合集到1 2 3 4 6 7,
此时集合2内的数据已经合并完毕,集合1还有8 9 数据,这个时候直接追加到合集中即可
*/
	while(i <= middle)
	{
    
    
		temp[k++]=arr[i++];
	}
	//与上while类似,只是这里剩余的是集合2的数据
	while(j<=end)
	{
    
    
		temp[k++]=arr[j++];
	}
	
	//把临时变量中的数值拷贝到数组中
	for(i=start; i <=end; i++)
	{
    
    
		arr[i]=temp[i];
	}
}

//start,end参数均为数值的下标值
void mergeSort(int arr[], int *temp, int start, int end)
{
    
    
	int middle=0;
	if(start< end)
	{
    
    
		middle=start+(end-start)/2;
		mergeSort(arr, temp, start, middle);
		mergeSort(arr, temp, middle+1, end);
		merge(arr, temp, start, middle, end);
	}
}

//调用函数
int main()
{
    
    
	int arr[9]={
    
    1,4,2,6,7,3,5,10,9};
	int temp[9]={
    
    0};
	int len=9;
	
	mergeSort(arr, temp, 0, len-1);
}

Supongo que te gusta

Origin blog.csdn.net/locahuang/article/details/110181499
Recomendado
Clasificación