113-Realização e análise do algoritmo de classificação de mesclagem bidirecional

Algoritmo de classificação de fusão bidirecional

Combine os dados de dois segmentos adjacentes (que já estão em ordem) em uma peça. Após a fusão ser concluída, todo o segmento ainda está em ordem.
Inicialmente, um único dado é considerado um segmento ordenado.

Primeiro escreva as funções auxiliares que você precisa usar

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
/*辅助函数:
    1.打印数据
	2.判断整个数据序列是否已经有序
	3.交互两个数据swap方法
*/

void Show(int *arr,int len)//打印数据
{
    
    
	for(int i=0;i<len;++i)
	{
    
    
		printf("%d  ",arr[i]);
	}
	printf("\n");
}

bool IsSort(int *arr,int len)//判断整个数据序列是否已经有序
{
    
    
	for(int i=0;i<len-1;++i)
	{
    
    
		if(arr[i]>arr[i+1])
		{
    
    
			return false;
		}
	}
	return true;
}

void SwapValue(int *a,int *b)//交互两个数据swap方法
{
    
    
	int tmp=*a;
	*a=*b;
	*b=tmp; 
}

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

l1: o índice do primeiro elemento do primeiro parágrafo
h1: o índice do último elemento do
primeiro parágrafo l2: o índice do primeiro elemento do
segundo parágrafo h2: o índice do último elemento do segundo parágrafo
Implementar dois -way merge algoritmo

void Meger(int *arr,int len,int section_size,int *brr)
{
    
    
	int l1=0;
	int h1=l1+section_size-1;
	int l2=h1+1;
	int h2=l2+section_size<len?l2+section_size-1:len-1;
	
	int brr_index=0;
	
	//有两个归并段
	while(l2<len)
	{
    
    
		//两个归并段中都有数据时
		while(l1<=h1&&l2<=h2)
		{
    
    
			if(arr[l1]<arr[l2])
			{
    
    
				brr[brr_index++]=arr[l1++];
			}
			else
			{
    
    
				brr[brr_index++]=arr[l2++];
		    } 
		}
		//剩下一个归并段有数据
		while(l1<=h1)
		{
    
    
			brr[brr_index++]=arr[l1++];
		}
		while(l2<=h2)
		{
    
    
			brr[brr_index++]=arr[l2++];
		}
		l1=h2+1;
		h1=l1+section_size-1;
		l2=h1+1;
		h2=l2+section_size<len?l2+section_size-1:len-1;
	}
	//仅剩下一个归并段
	while(l1<len)
	{
    
    
		brr[brr_index++]=arr[l1++];
	}
	//将brr的数据全部导入到arr中
	for(int i=0;i<len;++i)
	{
    
    
		arr[i]=brr[i];
	} 
}
	  
void MegerSort(int *arr,int len)
{
    
    
	int *brr=(int *)malloc(sizeof(arr[0])*len);
	assert(brr!=NULL);
	for(int i=1;i<len;i*=2)
	{
    
    
		Meger(arr,len,i,brr);
	}
	free(brr);
}

Finalmente complete a função principal

int main()
{
    
    
	int arr[]={
    
    7,87,29,75,41,50,62,92,69,22,76,77,35};
	Show(arr,sizeof(arr)/sizeof(arr[0]));
	MegerSort(arr,sizeof(arr)/sizeof(arr[0]));
	Show(arr,sizeof(arr)/sizeof(arr[0])); 
	return 0;
	
}


Insira a descrição da imagem aqui
Análise do algoritmo de fusão bidirecional para resultados em execução
Complexidade de tempo O (nlogn)
Complexidade de espaço O (n)
Estabilidade: estável

Acho que você gosta

Origin blog.csdn.net/LINZEYU666/article/details/111600826
Recomendado
Clasificación