二路归并排序算法代码,归并排序C语言,c++实现二路归并排序的示例代码

二路归并排序算法代码,归并排序C语言,c++实现二路归并排序的示例代码

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: