合并排序算法

合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称为二路合并。
排序流程:
原始数据: 67 65 77 38 97 3 33 49 34

第一遍: 65 67 38 77 3 79 33 49 34

第二遍: 38 65 67 77 3 33 49 97 34

第三遍: 3 33 38 49 65 67 77 97 34

第四遍: 3 33 34 38 49 65 67 77 97



public class MergeSort {
static final int SIZE=15;
static void mergeOne(int a[],int b[],int n,int len) //完成一遍合并的函数
{
int i,j,k,s,e;

s=0;
while(s+len<n)
{
e=s+2*len-1;
if(e>=n) //最后一段可能少于len个结点
{
e=n-1;
}
//相邻有序段合并
k=s;
i=s;
j=s+len;
while(i<s+len && j<=e) //如果两个有序表都未结束时,循环比较
{
if(a[i]<=a[j]) //如果较小的元素复制到数组b中
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++];
}
}
while(i<s+len) //未合并的部分复制到数组b中
{
b[k++]=a[i++];
}
while(j<=e)
{
b[k++]=a[j++]; //未合并的部分复制到数组b中
}

s=e+1; //下一对有序段中左段的开始下标
}
if(s<n) //将剩余的一个有序段从数组A中复制到数组b中
{
for(;s<n;s++)
{
b[s]=a[s];
}
}
}
static void mergeSort(int a[],int n) //合并排序
{
// int *p;
int h,count,len,f;

count=0; //排序步骤
len=1; //有序序列的长度
f=0; //变量f作标志
// if(!(p=(int *)malloc(sizeof(int)*n))) //分配内存空间
// {
// printf("内存分配失败!\n");
// exit(0);
// }
int[] p=new int[n];
while(len<n)
{
if(f==1) //交替在A和P之间合并
{
mergeOne(p,a,n,len); //p合并到a
}
else
{
mergeOne(a,p,n,len); //a合并到p
}
len=len*2; //增加有序序列长度
f=1-f; //使f值在0和1之间切换

count++;
System.out.printf("第"+count+"步排序结果:"); //输出每步排序的结果
for(h=0;h<SIZE;h++)
{
System.out.printf(" "+a[h]); //输出
}
System.out.print("\n");

}
if(f==1) //如果进行了排序
{
for(h=0;h<n;h++) //将内存p中的数据复制回数组a
{
a[h]=p[h];
}
}
// free(p); //释放内存
}
public static void main(String[] args)
{
int[] shuzu=new int[SIZE];
int i;

for(i=0;i<SIZE;i++)
{
shuzu[i]=(int)(100+Math.random()*(100+1)); //初始化数组
}

System.out.print("排序前的数组为:\n"); //输出排序前的数组
for(i=0;i<SIZE;i++)
{
System.out.print(shuzu[i]+" ");
}
System.out.print("\n");

mergeSort(shuzu,SIZE); //排序操作

System.out.print("排序后的数组为:\n");
for(i=0;i<SIZE;i++)
{
System.out.print(shuzu[i]+" "); //输出排序后的数组
}
System.out.print("\n");

}

}

合并排序算法-c++ 参考来源:http://www.cnblogs.com/yangecnu/p/Introduce-Merge-Sort.html 合并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序。合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行合并。 合并排序最大的优点是它的时间复杂度为O(nlgn),这个 阅读详情

相关推荐

Java实现合并排序算法详解

分治策略,即分而治之,是一种在计算机科学中经常使用到的解决问题的策略。它将一个复杂的问题分解成两个或两个以上的相同或相似的子问题,直到子问题足够简单,可以被直接解决。之后,再将这些子问题的解合并为原问题的解。分治策略具有以下特点:分解:将原问题分解为若干个规模较小但类似于原问题的子问题。解决:若子问题足够小,则直接解决;否则递归地应用分治策略继续解决。合并:将各个子问题的解合并为原问题的解。分治算法的设计思路清晰,易于理解和实现。

weixin_42600407的博客 691

算法之归并排序算法(merge sort)

归并排序算法 1.算法原理 归并排序算法是分治法(Divide-and-Conquer)的典型应用。其操作的步骤如下: Divide:把n个元素的序列分为两个元素个数为n/2的子序列。Conquer:递归的调用归并排序算法对两个子序列进行排序Combine:对排好序的子序列进行合并,得到最后排序的结果。 归并算法用示意图表示如下: 归并排序算法的伪代码如下: M

Second的专栏 1万+

分治法合并排序算法实践

递归函数有两个基本要素:基本情况和递归步骤。基本情况通常是一些简单条件,它们不需要再次调用函数本身即可直接解决。递归步骤则是将问题分解为更小的子问题,并调用函数自身来解决这些子问题。if base_condition: # 基本情况else:# 递归步骤在征服阶段的递归应用中,基本情况通常是数组的大小减至到1或者0,此时排序可以直接进行,而无需再次分割。递归步骤则是将数组一分为二,对每一半再递归地应用征服阶段,直至达到基本情况。

weixin_42510243的博客 1134

合并排序(归并排序)

合并排序,大致思想便是先将数组中的元素拆分成若干小部分,然后再将这些小部分按照顺序进行重新组合,从而实现排序。很明显,这里用到了分治法的思想,即将一个大问题分成若干个相同的小问题,因为问题规模变小了,所以解决问题的难度也随之减小,试想一下,对一个拥有10000个元素的数组进行排序简单还是对一个只拥有1个元素的数组进行排序简单?答案很明显。 对于合并排序,将大问题分成若干小问题是一件很容易的事情,只需要不断递归即可,其中最主要的难点就是将这些小问题解决之后,如何再将这些小问题合并起来,若是处理不好,很可能就导

学习永无止境 1万+

归并排序MERGESORT

********************************************************** 合并排序伪代码如下: MERGE(A, p, q, r) 1 n1 ← q - p + 1 2 n2 ← r - q 3 create arrays L[1 ‥ n1 + 1] and R[1 ‥ n2 + 1] 4 for i ← 1 to n1 5 do L[i] ← A[p + i - 1] 6 for j ← 1 to n2 7 do R[j] ← A[q + j] 8 L[n1 + 1] ← ∞ 9 R[n2 + 1] ← ∞ 10 i ← 1 11 j ← 1 12 for k ← p to r 13 do if L[i] ≤ R[j] 14 then A[k] ← L[i] 15 i ← i + 1 16 else A[k] ← R[j] 17 j ← j + 1 MERGE-SORT(A, p, r) 1 if p < r 2 then q ← ??(p + r)/2?? 3 MERGE-SORT(A, p, q) 4 MERGE-SORT(A, q + 1, r) 5 MERGE(A, p, q, r) *********************************************************/

排序算法实现代码与伪代码

本压缩包中包含了各种冒泡算法的代码实现与伪代码实现,附有对排序算法思想的解释,方便读者快速掌握排序算法。

合并排序算法伪码

合并排序伪码 这里只给出伪码,分析详见《计算机算法设计与分析》。 void MergeSort (int a[],int left,int right) { if (left<right) { int i=(left+right)/2; MergeSort (a,left,i); MergeSort (a,i+1,right); Merge(a,b,left,i,right); Copy(a,b,left,right); } } void Merge(int a[]

taylorswift的博客 2723

归并排序(C++语言描述)

使用C++书写的归并排序算法,希望对各位有用。也请大牛指教代码中有何不足的地方!

插入合并排序对比实验--伪代码+完整代码

插入合并排序对比实验--伪代码+完整代码

m0_62452833的博客 2234

SAP BTP-Cloud foundry 构建并部署JAVA应用程序

本文为 SAP BTP Java 应用程序的简单实例, 我们可以用此实例来熟悉SAP BTP 中的java应用开开发流程.在你完成改示例java应用程序以后, 我们可以直接使用该java应用程序进行后续的开发流程, 或直接构建一个新的JAVA应用程序来支持新的业务开发。

seyafly的博客 803

AI 与新媒体

AI重构新媒体生态:从生产到分发的全链路变革 AI正成为新媒体领域的核心基础设施,通过五大能力重塑内容产业:自动化生产(AIGC写作/制图/剪辑效率提升5-10倍)、智能分发(算法精准匹配用户)、数据洞察(实时舆情分析)、风险管控(审核效率提升12倍)和运营优化(A/B测试自动化)。这推动行业从"人找内容"转向"内容找人",制作成本下降90%的同时,也带来同质化加剧、版权争议和职业重构等挑战。当前阶段,人机协同成为主流——AI处理标准化生产,人类专注创意与价值观把控。

eastyuxiao的专栏 381

c语言合并排序算法_合并排序算法

c语言合并排序算法 合并排序算法 (Merge Sort Algorithm) Merge Sort follows the rule of Divide and Conquer to sort a given set of numbers/elements, recursively, hence consuming less time. 合并排序遵循分而治之的规则,以递归方式对一组给定的数字...

cunfen6312的博客 5800

多节阶梯阻抗变换器工程设计的公式推导

  多节阶梯阻抗变换器工程设计的公式推导,仔细看此文,有点烧脑,所以碎片十分钟,收获一丢丢。   现在就来设计一个超宽带多节阶梯阻抗变换器,要求带内纹波符合切比雪夫分布。   其实,此文已经是省去了大量中间公式推导,只剩下精炼内容了。   阶梯阻抗变换器指标需求   假设现在有一项目需求分析结果是:做一个微带线超宽带阶梯阻抗变换器,指标如下:   从50欧变换到100欧;   回波损耗22dB;   功率容量:2W;   频率范围2~18GHz;   插损能做多少就多少,用30mil板厚.

wusuowei1010的博客 7809

自然合并排序算法

合并排序基本思想:将待排序元素分成大小大致相同的两个子集和,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。

u014034497的专栏 1万+

k8s 查看cpu使用率最高的pod

在 Kubernetes 中,可以使用命令查看 Pod 的资源使用情况,从而找到 CPU 使用率最高的 Pod。

u010674101的专栏 3345

java 合并排序算法_Java 程序实现合并排序算法

Java 程序实现合并排序算法在此示例中,我们将学习在Java中执行合并排序算法。在学习Java中的合并排序算法之前,请确保您了解合并排序算法的工作原理。示例:实现合并排序算法的Java程序示例importjava.util.Arrays;//Java中的合并排序classMain{//将两个子数组L和M合并为数组voidmerge(intarray[],intp,intq,i...

weixin_30395665的博客 1027

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景,JDK与JDBC,Java Web技术,Spring Boot系列,以及MyBatis框架的基本实现,最后还将讨论Java在大数据、人工智能、嵌入式和Android等领域的应用。

wnm23的专栏 5239

排序算法——合并排序

houapple的记忆屋 1068

在虚拟机中对阿克曼转向车进行导航及避障的仿真测试

一、    在我使用rosdep install teb_local_planner去安装teb_local_planner的时候,报错:Command ‘rosdep’ not found, but can be installed with:sudo apt install python3-rosdep2    我花大半个月好不容易建立起的一系列ROS环境,被python3-rosdep2这条万恶的语句连同ROS一起给我删了。。。悲伤来的那么猝不及防    随着ROS版本的迭代,相关资料很多都不再适用

慕羽★的博客 3807

Copilot在游戏开发中的应用:Unity脚本自动生成实践

2021年GitHub Copilot的发布,为代码自动生成带来了革命性突破。作为基于GPT模型训练的AI辅助编程工具,Copilot能根据注释、函数名、代码上下文,实时生成符合语法和逻辑的代码片段,甚至完整脚本。减少重复劳动:自动生成模板代码(如生命周期、结构),让你专注核心逻辑;降低API学习成本:对Unity特有的组件(RigidbodyAnimator)、类(),Copilot能生成符合最佳实践的调用代码;统一代码风格:通过团队共享提示词模板,让生成的代码符合项目规范;快速原型迭代。

AIGC应用创新大全的博客 1619

javascript 合并排序算法

javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: function merge(left,right) { var result=[]; while(left.length>0&&right.length>0) { if(left[0]<right[0]) result.push(left.shif

raisezhang 的专栏 2475

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 快速排序算法
下一篇: 堆排序法
lyl130
博客等级 码龄18年 0粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值