`

归并排序--java

 
阅读更多
一、描述
   1,数组中的每个元素视为一个有序表(共有n个有序表)
   2,每相邻的两个有序表进行归并,生成一个新的有序表
   3,当下一次归并的个数为0时结束(即mid=size/(len<<1))len为当前有序表的长度--------因为每次归并需要两个长度为len的有序表,当条件不满足时,便会结束,(mid表示当前有几对有序表)

class merge
{
	//对两个有序表进行归并
	//s start,m middle, t terminal---a[s]--a[m-1]为一个有序表;a[m]-a[t]为一个有序表
	public static void merge(int a[],int s,int m,int t){
		//临时表用于存放对这两张表归并后的列表
		int temp[] =new int[t-s+1];
		//i,j分别为指向两个列表的指针
		int i=s,j=m,k=0;
		while (i<m && j<=t)
		{
			if(a[i]>a[j]){
				temp[k++]=a[j++];
			}else{
				temp[k++]=a[i++];
			}
		}	
		//左边还有剩余
		while(i<m){
			temp[k++]=a[i++];
		}
		//右边还有剩余
		while(j<=t){
			temp[k++]=a[j++];
		}
		//将归并好的有序列表temp考贝到原列表a中
		System.arraycopy(temp,0,a,s,temp.length);
	}
	public static void mergeSort(int[] a,int len){
		//len 是每个有序集合的长度
		int size=a.length;
		int mid=size/(len<<1);//当前有mid对有序表(每张有序表的长度为len)
		int c=size&((len<<1)-1);//c是余数,与运算都为1时才为1;len是2的n次方,(len<<1-1)表示len位上有n个1------指除了mid对有序表外剩下的数据

		int s=0;
		for(int i=0;i<mid;i++){
		   s=i*2*len;//每一个有序集合是要跟相邻的集合进行归并
		   merge(a,s,s+len,s+(len<<1)-1);
		}
		if(c !=0){
			//有一个集合的长度不够len,c为剩下的元素数
			//将剩下的数,和倒数一个有序集合归并(倒数一个有序集合的长度为len*2)
			merge(a,size-c-(len<<1),size-c,size-1);
		}

      if(mid==1){//当前有序表的对数为1时结束,上方已经一对完整的有序表排序,并将不足对数的有序表进行了排序
			return;
		}

		mergeSort(a,len*2);
	}
	public static void main(String args[]){
	    int[] a=new int[]{4,3,6,1,2,5,2,2,2,2,0,0,3,1,9,9,9};
		mergeSort(a,1);
		print(a);
	}
	public static void print(int a[]){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}


H:\learn\algorithm>javac merge.java

H:\learn\algorithm>java merge
0  0  1  1  2  2  2  2  2  3  3  4  5  6  9  9  9

H:\learn\algorithm>
分享到:
评论

相关推荐

    java实现归并排序

    Java实现归并排序 Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 ...

    归并排序Java_归并排序_

    在Java中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序,然后将排序后的子序列合并成一个有序序列。这...

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...

    如何使用Java实现归并排序算法,程序详细解读

    归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序...

    Java实现归并排序

    在Java中实现归并排序,主要涉及到以下几个关键步骤: 1. **分割(Divide)**:将原始数组分为两个相等(或接近相等)的子数组。这通常通过取数组中间索引来完成。例如,如果数组长度为`n`,则可以将前`n/2`个元素...

    归并排序(JAVA)

    在Java中实现归并排序,我们可以将一个大数组分成两个小数组,分别对它们进行排序,然后将排序后的子数组合并成一个有序的大数组。这个过程会递归地进行,直到每个子数组只包含一个元素,因为单个元素天生就是有序的...

    Java归并排序-附件资源

    Java归并排序-附件资源

    java代码-使用java解决java排序之-归并排序的问题的源代码

    java代码-使用java解决java排序之-归并排序的问题的源代码 ——学习参考资料:仅用于个人学习使用!

    [Java算法-排序]归并排序.java

    该资源提供了一份全面的指南,介绍了如何在Java中实现归并排序。文档中涵盖了归并排序的基本概念,包括如何对数组进行排序以及如何在Java中实现归并排序。此外,文档还包括一个逐步指南,介绍如何在Java中实现归并...

    归并排序Java源代码

    利用分治法思想实现归并排序,Java语言描述。

    java代码-归并排序-----

    在Java编程中,归并排序的应用广泛,尤其对于大数据处理,因为它具有稳定的性能和O(n log n)的时间复杂度。以下是关于归并排序的详细讲解。 **归并排序的基本原理** 1. **分治法**:归并排序将待排序的数组分为两...

    详解Java常用排序算法-归并排序

    Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...

    JavaSwing归并排序动画源码(含其他排序)

    在这个场景中,我们讨论的焦点是使用 Java Swing 来实现一个排序算法的动画展示,特别是归并排序。归并排序是一种高效的、稳定的排序算法,它的基本思想是将大问题分解为小问题来解决,通过递归地将两个或更多有序数...

    java代码-归并排序-Java

    在Java编程中,归并排序通常用于对数组或列表进行排序,其核心思想是将数组分为两半,分别对它们进行排序,然后合并两个已排序的子数组以得到最终的有序序列。 **归并排序的基本步骤:** 1. **划分(Divide)**:...

    外部归并排序Java实现

    Java实现外部归并排序的过程包括以下几个关键步骤: 1. **划分阶段**: - 将原始数据分割成多个小文件,每个文件包含可以一次性加载到内存中的数据量。这通常通过创建一系列的子序列(也称为块或桶)完成。 - 对...

    算法-理论基础- 排序- 归并排序(包含源程序).rar

    2. 归并排序的源代码实现,可能是C++、Java、Python或其他编程语言。 3. 对归并排序算法的性能分析,包括时间复杂度和空间复杂度的讨论。 4. 实际应用示例,展示如何在实际编程中使用归并排序。 5. 归并排序与其他...

    java归并排序

    在Java中实现归并排序,我们可以分别实现递归版和非递归版,这两种方法各有其特点和适用场景。 ### 1. 分治策略 归并排序的核心是分治法,它将一个大数组分为两个相等或接近相等的子数组,分别对这两个子数组进行...

Global site tag (gtag.js) - Google Analytics