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;
}
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;
}
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