`

合并排序算法

阅读更多
    合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称为二路合并。
    排序流程:
    原始数据: 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经典算法之合并排序法

    本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种非常有效的排序方法,其核心思想是分治法:将数据分为若干个子集,对这些子集分别进行排序,最后将排序...

    自底向上合并排序算法

    以下是对自底向上合并排序算法的详细步骤: 1. **初始化**:假设我们有一个包含n个元素的数组A。我们将数组视为n个长度为1的子数组,即每个元素本身就是一个有序的子数组。 2. **合并阶段**:从长度为1的子数组...

    合并排序算法——merge sort

    /************合并排序算法的实现******************/ int main() { int p,q,r; printf("合并排序算法的实现:\n"); printf("请输入p、q、r的值(输入格式1,12,13):"); scanf("%d,%d,%d",&p,&q,&r); printf("p=%...

    Strassen矩阵乘法和棋盘覆盖和自然合并排序算法

    Strassen矩阵乘法和棋盘覆盖和自然合并排序算法Strassen矩阵乘法和棋盘覆盖和自然合并排序算法Strassen矩阵乘法和棋盘覆盖和自然合并排序算法Strassen矩阵乘法和棋盘覆盖和自然合并排序算法Strassen矩阵乘法和棋盘...

    自然合并排序算法

    自然合并排序算法,对合并排序算法进行进一步的优化

    合并排序算法C语言源程序.zip

    本文将详细探讨合并排序算法的理论基础,C语言实现的关键步骤,以及如何验证程序的正确性。 合并排序的核心思想是将大问题分解为小问题,再将解决小问题的结果合并,最终得到大问题的解决方案。具体到排序,就是将...

    合并排序算法的C语言实现

    合并排序算法的C语言实现,在VC开发环境下验证通过

    分治法合并排序算法实现merge

    在提供的压缩包文件中,很可能是包含了实现合并排序算法的代码。代码可能包括以下几个关键部分: 1. **函数定义**:定义一个名为`merge_sort`的函数,接受一个列表作为参数。 2. **基本情况**:检查列表长度是否为1...

    一种快速的排序法—插入合并排序法

    基于上述分析,可以得出结论:如果设计一种排序算法,使得在数据集大小n≤23时采用插入排序,而在n&gt;23时采用合并排序,则该算法的整体性能将优于单一的合并排序算法。 #### 算法设计原理 插入合并排序法的基本思路...

    合并排序(分治策略)报告.doc

    在实验中,程序会根据预设的规模(如宏定义的 N)随机生成整数数组,然后使用合并排序算法对其进行排序。 2. **实验目的**: - 熟悉和理解分治算法的基本概念和应用。 - 掌握合并排序的实现细节,包括如何分割...

    合并排序算法的代码实现

    合并排序(Merge Sort)是一种基于分治策略的高效排序算法,它的主要特点是稳定且具有较高的时间效率。在本文中,我们将深入探讨合并排序的工作原理、Java实现细节以及其优势和适用场景。 ### 合并排序的基本思想 ...

    合并排序算法和二分搜索技术算法的实现实验报告.doc

    合并排序算法和二分搜索技术算法的实现实验报告.doc

    合并排序算法(本地交换)的C语言实现

    合并排序的合并算法一般是异地交换,本文件通过本地交换和异地交换两种方式实现了合并排序,在VC开发环境下验证通过

    c++合并排序算法递归与非递归方式

    c++实现的合并排序算法 用递归和非递归两种方式实现的

    合并排序算法 C 语言 visio studio2010

    合并排序算法是一种高效的排序算法,基于“分治”策略,由计算机科学家John W. Hoare在1960年提出。这种算法将一个大问题分解为小问题来解决,然后将小问题的解合并,得到原问题的解。在排序过程中,合并排序将一个...

    合并排序的c++实现程序

    合并排序是一种高效的、基于分治...整个程序就是这样实现了合并排序算法,其时间复杂度为O(n log n),空间复杂度为O(n)(如果考虑额外的合并空间需求)。这个C++程序展示了如何利用分治法高效地对大规模数据进行排序。

    合并排序算法,快速排序算法,递归,分治

    合并排序算法、快速排序算法和递归分治是计算机科学中的基础概念,它们在数据处理和算法设计中占据着重要地位。以下是对这些知识点的详细解释: **合并排序算法(Merge Sort)** 合并排序是一种基于分治策略的排序...

    合并排序算法非递归形式源码

    合并排序算法是一种经典的排序算法,由计算机科学家John W. Backus在1959年提出。它的主要思想是采用分治法(Divide and Conquer)将大问题分解为小问题来解决。在这个过程中,我们将一个大的序列拆分为两个或多个小...

Global site tag (gtag.js) - Google Analytics