双方向マージソートアルゴリズム
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)
安定性:安定