一、描述
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中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序,然后将排序后的子序列合并成一个有序序列。这...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序...
在Java中实现归并排序,主要涉及到以下几个关键步骤: 1. **分割(Divide)**:将原始数组分为两个相等(或接近相等)的子数组。这通常通过取数组中间索引来完成。例如,如果数组长度为`n`,则可以将前`n/2`个元素...
在Java中实现归并排序,我们可以将一个大数组分成两个小数组,分别对它们进行排序,然后将排序后的子数组合并成一个有序的大数组。这个过程会递归地进行,直到每个子数组只包含一个元素,因为单个元素天生就是有序的...
Java归并排序-附件资源
java代码-使用java解决java排序之-归并排序的问题的源代码 ——学习参考资料:仅用于个人学习使用!
该资源提供了一份全面的指南,介绍了如何在Java中实现归并排序。文档中涵盖了归并排序的基本概念,包括如何对数组进行排序以及如何在Java中实现归并排序。此外,文档还包括一个逐步指南,介绍如何在Java中实现归并...
利用分治法思想实现归并排序,Java语言描述。
在Java编程中,归并排序的应用广泛,尤其对于大数据处理,因为它具有稳定的性能和O(n log n)的时间复杂度。以下是关于归并排序的详细讲解。 **归并排序的基本原理** 1. **分治法**:归并排序将待排序的数组分为两...
Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...
在这个场景中,我们讨论的焦点是使用 Java Swing 来实现一个排序算法的动画展示,特别是归并排序。归并排序是一种高效的、稳定的排序算法,它的基本思想是将大问题分解为小问题来解决,通过递归地将两个或更多有序数...
在Java编程中,归并排序通常用于对数组或列表进行排序,其核心思想是将数组分为两半,分别对它们进行排序,然后合并两个已排序的子数组以得到最终的有序序列。 **归并排序的基本步骤:** 1. **划分(Divide)**:...
Java实现外部归并排序的过程包括以下几个关键步骤: 1. **划分阶段**: - 将原始数据分割成多个小文件,每个文件包含可以一次性加载到内存中的数据量。这通常通过创建一系列的子序列(也称为块或桶)完成。 - 对...
2. 归并排序的源代码实现,可能是C++、Java、Python或其他编程语言。 3. 对归并排序算法的性能分析,包括时间复杂度和空间复杂度的讨论。 4. 实际应用示例,展示如何在实际编程中使用归并排序。 5. 归并排序与其他...
在Java中实现归并排序,我们可以分别实现递归版和非递归版,这两种方法各有其特点和适用场景。 ### 1. 分治策略 归并排序的核心是分治法,它将一个大数组分为两个相等或接近相等的子数组,分别对这两个子数组进行...