本文主要介绍C语言实现双向归并排序的示例代码。本文中非常详细地介绍了示例代码,对大家的学习或工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。
双向合并排序
基本思想
双向合并排序是将两个有序子表合并成一个有序表。首先我们要有一个合并的算法:两个有序表放在同一个数组的相邻位置,arr[左]到arr[中心-1]是第一个有序表,arr[中心]到arr[右]是第二个有序表。从两端各取一个进行比较,先把小的放入一个temp数组,最后把剩下的比较直接放入temp,最后把temp复制回arr。这就是“治”。
所谓“分”,就是把前半部分和后半部分的数据分别递归合并排序。
算法分析
每次合并的时间复杂度为O(n),总共需要log2n时间。相应算法的时间复杂度为O(nlog2n)。归并的空间复杂度O(n)。另外,归并排序中的归并算法不会改变相同关键字的元素的相对顺序,所以归并排序是稳定的。
双向归并排序的前提是两个序列本身是有序的。
void Merger(int *arr,int len,int width)
{
int * temp=(int *)malloc(sizeof(int)*(len));
//首先分别初始化两个下标。
int L1=0;
int h1=L1 width-1;
int L2=h1 1;
int h2=l2 width - 1 len - 1?l2宽度-1:len-1;
int temppos=0;
//判断下标位置的值。
while (l1透镜l2透镜)
{
while (l1=h1 l2=h2)
{
if (arr[l1] arr[l2])
{
temp[temppos]=arr[L1];
}
其他
{
temp[temppos]=arr[L2];
}
}
//l1有剩余。
while (l1=h1)
{
temp[temppos]=arr[L1];
}
//l2有剩余。
而(l2=h2)
{
temp[temppos]=arr[L2];
}
//l1 l2向后移动
L1=H2 ^ 1;
h1=(l1宽度- 1) (len - 1)?(l1宽度-1):(len-1);
L2=h1 1;
h2=(l2宽度- 1) (len - 1)?(l2宽度-1):(len-1);
}
//奇数合并块留下一个单块操作
白色(l1透镜)
{
temp[temppos]=arr[L1];
}
//用temp覆盖arr
for(int I=0;我len我)
{
arr[I]=temp[I];
}
//free(temp);
}
void合并排序(int *arr,int len)
{
for(int I=1;我leni *=2)
{
合并(arr,len,I);
}
}
void show(int *arr,int len)
{
for(int I=0;我len我)
{
cout arr[I]' ';
}
}
int main()
{
int array[]={ 12,51,1,36,98,21,38,47 };
int len=sizeof(array)/sizeof(array[0]);
MergeSort(array,len);
show(array,len);
系统(“暂停”);
返回0;
}
PS:二路合并排序算法
#includeiostream
使用命名空间std
分类列表
{
公共:
SortableList(int mSize)
{
maxSize=mSize
l=new int[maxSize];
n=0;
}
~SortableList()
{
删除[]l;
}
void Merge(int,int,int);
void MergeSort(int,int);
void输入();
void输出();
私人:
int * l;
int maxSize
int n;
};
void SortableList:Input()
{
Cout '请输入要排序的数字:';
for(int I=0;I=maxSize-1;我)
CIN l[I];
}
void SortableList:Output()
{
Cout '排序后的数字是:';
for(int I=0;I=maxSize-1;我)
cout l[I]“”;
}
void sortable list:merge sort(int left,int right)
{
If (left right)//如果序列长度大于1,则除
{
int mid=(左右)/2;
MergeSort(左,中);//排序左边的序列
MergeSort(中1,右);//排序正确的序列
合并(左、中、右);//合并
}
}
void sortable list:Merge(int left,int mid,int right)
{
int * temp=new int[右-左1];
int i=left,j=mid 1,k=0;
While ((i=mid) (j=right))//确定序列是否为空。
if (l[i]=l[j])
temp[k]=l[I];
else temp[k]=l[j];
while (i=mid)
temp[k]=l[I];//右序列为空,左序列依次写入。
while (j=右)
temp[k]=l[j];//左序列为空,右序列依次写入。
for (i=0,k=左;k=右;)
l[k]=temp[I];//将临时存放在数组temp中的数据放入数组l中。
}
int main()
{
int m;
Cout '请输入要排序的数字个数:';
CIN m;
sortable list a1(m);
a1。input();
a1。MergeSort(0,m-1);
a1。output();
}
本文关于C的双向归并排序的示例代码到此为止。关于C的双向合并排序的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。