合并排序:把两个或多个有序序列合并为一个有序的序列。
例子:
合并503,703,765和087,512,677,得到087,503,512,677,703,765。每次比较两个序列最小的数,输出最小的,不断重复这个过程。
如:
<!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter" />
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0" />
<v:f eqn="sum @0 1 0" />
<v:f eqn="sum 0 0 @1" />
<v:f eqn="prod @2 1 2" />
<v:f eqn="prod @3 21600 pixelWidth" />
<v:f eqn="prod @3 21600 pixelHeight" />
<v:f eqn="sum @0 0 1" />
<v:f eqn="prod @6 1 2" />
<v:f eqn="prod @7 21600 pixelWidth" />
<v:f eqn="sum @8 21600 0" />
<v:f eqn="prod @7 21600 pixelHeight" />
<v:f eqn="sum @10 21600 0" />
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
<o:lock v:ext="edit" aspectratio="t" />
</v:shapetype><v:shape id="图片_x0020_4" o:spid="_x0000_i1029" type="#_x0000_t75"
style='width:106.5pt;height:36.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
得到:
<!--[if gte vml 1]><v:shape
id="图片_x0020_7" o:spid="_x0000_i1028" type="#_x0000_t75" style='width:130.5pt;
height:45pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image003.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
然后:
<!--[if gte vml 1]><v:shape
id="图片_x0020_10" o:spid="_x0000_i1027" type="#_x0000_t75" style='width:141.75pt;
height:30pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image005.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
接着:
<!--[if gte vml 1]><v:shape
id="图片_x0020_13" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:162.75pt;
height:29.25pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image007.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
直到一个序列被取尽。
流程图,如下:
<!--[if gte vml 1]><v:shape
id="图片_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75" style='width:272.25pt;
height:159.75pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image009.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
代码如下:
private void Merge(int seq1[],int start1,int end1,int[]seq2,int start2,int end2 ){
int [] mergeSeq=new int [end1+end2-start1-start2];
int i=0;
while(start1<=end1||start2<=end1){
if(start1>end1||seq1[start1]>seq2[start2]){
mergeSeq[i]=seq2[start2];
start2++;
i++;
}
else if(start2>end2 ||seq1[start1]<=seq2[start2]){
mergeSeq[i]=seq1[start1];
mergeSeq[i]=seq1[start1];
start1++;
i++;
}
}
}
归并排序:采用分治法(Divide and Conquer)和合并排序的一种排序算法;
基本思想:把序列R[start…end]划分为R[start…middle]和R[middle…end],对R[start…middle]和R[middle…end]分别用合并排序,直到被划分的序列为只包含一个元素为止。再对R[start…middle]和R[middle…end]进行合并排序。
实例:
数组A有7个数据,分别是: 49 38 65
97 76 13 27,那么采用归并排序算法的操作过程如图7所示:
初始值
[49] [38] [65] [97]
[76] [13] [27]
看成由长度为1的7个子序列组成
第一次合并之后
[38 49] [65
97] [13 76] [27]
看成由长度为1或2的4个子序列组成
第二次合并之后
[38 49
65 97] [13
27 76]
看成由长度为4或3的2个子序列组成
第三次合并之后
[13 27
38 49
65 76 97]
代码实现:
void Merge(SeqList
R,int low,int m,int high)
{//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的
//子文件R[low..high]
int i=low,j=m+1,p=0; //置初始值
RecType *R1; //R1是局部向量,若p定义为此类型指针速度更快
R1=(ReeType *)malloc((high-low+1)*sizeof(RecType));
if(! R1) //申请空间失败
Error("Insufficient memory
available!");
while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上
R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];
while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中
R1[p++]=R[i++];
while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
R1[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
R[i]=R1[p];//归并完成后将结果复制回R[low..high]
} //Merge
分享到:
相关推荐
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由世界著名计算机科学家Donald E. Knuth撰写。这套书深入探讨了程序设计的各种方法和技术,包括基础算法、半数值算法和排序与查找算法,对全球程序员和...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由美国计算机科学家唐·艾伦·高德纳(Donald Ervin Knuth)撰写。这部多卷本巨著深入探讨了算法设计、分析以及编程语言的设计原理,对于理解计算机科学的...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由世界著名的计算机科学家Donald E. Knuth撰写。这套书深入探讨了程序设计的各种方法和技术,是程序员和计算机科学家的宝贵资源。以下是各卷的主要内容: 1...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由著名计算机科学家Donald Knuth撰写。这本书的第3卷专门探讨了排序与查找这两个核心的算法主题,它们是编程和数据处理的基础。在本卷中,Knuth深入剖析了...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由美国计算机科学家Donald E. Knuth撰写。这套书籍涵盖了程序设计、算法分析以及计算理论等多个方面的深度内容,对程序员、软件工程师以及计算机科学学者...
根据提供的文件信息,“计算机程序设计艺术(第二卷).pdf”,我们可以推断出这份文档主要涉及计算机程序设计领域的深入探讨和技术细节。然而,由于提供的内容非常有限,我们将基于标题、描述以及部分可见的信息来...
《计算机程序设计艺术》是一套深受程序员和计算机科学爱好者推崇的经典著作,由计算机科学家Donald E. Knuth撰写。这套书籍分为四卷,每卷都涵盖了不同的主题,旨在深入探讨算法和程序设计的核心概念。其中: 第一...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由美国计算机科学家Donald Knuth撰写。这套书共计三卷,深入探讨了算法和程序设计的精髓,为读者提供了丰富的理论基础和实践经验。每一卷都包含了大量精心...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由著名计算机科学家Donald Knuth撰写。这套书系统地探讨了程序设计的理论和实践,涵盖了从基础算法到复杂数据结构的广泛主题,对于深入理解计算机科学的核心...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由世界知名计算机科学家Donald E. Knuth撰写。这本书全面深入地探讨了程序设计的原则、方法和技术,旨在提高程序员的技能和对计算机系统的理解。卷1-4合集...
《计算机程序设计艺术》是由美国计算机科学家Donald Knuth所著的一套经典计算机科学丛书,它在IT领域享有极高的声誉,被众多专业人士视为必读之作,包括比尔·盖茨在内的许多技术大牛都曾给予高度评价。这套书籍深入...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由Donald E. Knuth撰写。这部巨著分为多卷,每一卷深入探讨了程序设计的各个方面。本问题中提到的是第3卷,虽然描述中提到了第2卷,但我们的焦点在于第3卷的...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由美国计算机科学家Donald E. Knuth撰写。这套书籍共分为七卷,详细探讨了程序设计的各个方面,包括基础算法、数据结构、数值计算、字符串处理、图形算法...
但是,从标题“计算机程序设计艺术 第1卷.pdf”和标签“计算机 编程”可以推测,这本电子书可能是关于计算机程序设计的基础知识和方法论的介绍。 《计算机程序设计艺术》是由Donald E. Knuth所著的一系列书籍,这些...
《计算机程序设计艺术》是由计算机科学巨匠Donald E. Knuth所著的一部经典之作,全书分为七卷,但目前公开的只有前三卷。这部作品深入探讨了计算机编程的各个方面,是程序员和计算机科学家的重要参考文献。在这里,...
- **贡献**:克努特以其对算法分析的深入研究而闻名于世,《计算机程序设计艺术》是他最著名的成就之一,该系列书籍详细阐述了算法的设计与分析。 #### 3. 内容提要 - **算法分析**:本书是关于算法分析的经典著作...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由著名计算机科学家Donald Knuth撰写。这本书深入探讨了算法和程序设计的高级技术,旨在提高软件开发者的技艺和理解。中文版的出版使得更多的中国读者能够...
《计算机程序设计艺术》是计算机科学领域的一部经典著作,由世界著名的计算机科学家Donald E. Knuth撰写。这本书深入探讨了程序设计的原则、方法和技术,是程序员和计算机科学家的宝贵资源。中文版的出版使得更多...
《计算机程序设计艺术》(The Art of Computer Programming)是由计算机科学巨匠Donald E. Knuth撰写的一套权威性算法分析丛书。这套书籍以其深入浅出的讲解方式、严谨的数学分析和对计算机科学的深刻洞察而闻名,是...