113-双方向マージソートアルゴリズムの実現と分析

双方向マージソートアルゴリズム

2つの隣接するセグメント(すでに
順序付けられている)のデータを1つのピースに結合します。マージが完了した後も、セグメント全体が引き続き順序付けられます。最初は、1つのデータが順序付けられたセグメントと見なされます。

まず、使用する必要のある補助関数を記述します

#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:最初の段落の最初の要素のインデックス
h1:最初の段落の最後の要素のインデックス
l2:
2番目の段落の最初の要素のインデックスh2:2番目の段落の最後の要素のインデックス
実装2 -ウェイマージアルゴリズム

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

最後にメイン機能を完了します

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

結果
ここに画像の説明を挿入
実行するための双方向マージアルゴリズムの分析
時間計算量O(nlogn)
空間計算量O(n)
安定性:安定

おすすめ

転載: blog.csdn.net/LINZEYU666/article/details/111600826
おすすめ