合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称为二路合并。
排序流程:
原始数据: 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");
}
}
分享到:
相关推荐
本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种非常有效的排序方法,其核心思想是分治法:将数据分为若干个子集,对这些子集分别进行排序,最后将排序...
以下是对自底向上合并排序算法的详细步骤: 1. **初始化**:假设我们有一个包含n个元素的数组A。我们将数组视为n个长度为1的子数组,即每个元素本身就是一个有序的子数组。 2. **合并阶段**:从长度为1的子数组...
/************合并排序算法的实现******************/ 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矩阵乘法和棋盘...
自然合并排序算法,对合并排序算法进行进一步的优化
本文将详细探讨合并排序算法的理论基础,C语言实现的关键步骤,以及如何验证程序的正确性。 合并排序的核心思想是将大问题分解为小问题,再将解决小问题的结果合并,最终得到大问题的解决方案。具体到排序,就是将...
合并排序算法的C语言实现,在VC开发环境下验证通过
在提供的压缩包文件中,很可能是包含了实现合并排序算法的代码。代码可能包括以下几个关键部分: 1. **函数定义**:定义一个名为`merge_sort`的函数,接受一个列表作为参数。 2. **基本情况**:检查列表长度是否为1...
基于上述分析,可以得出结论:如果设计一种排序算法,使得在数据集大小n≤23时采用插入排序,而在n>23时采用合并排序,则该算法的整体性能将优于单一的合并排序算法。 #### 算法设计原理 插入合并排序法的基本思路...
在实验中,程序会根据预设的规模(如宏定义的 N)随机生成整数数组,然后使用合并排序算法对其进行排序。 2. **实验目的**: - 熟悉和理解分治算法的基本概念和应用。 - 掌握合并排序的实现细节,包括如何分割...
合并排序(Merge Sort)是一种基于分治策略的高效排序算法,它的主要特点是稳定且具有较高的时间效率。在本文中,我们将深入探讨合并排序的工作原理、Java实现细节以及其优势和适用场景。 ### 合并排序的基本思想 ...
合并排序算法和二分搜索技术算法的实现实验报告.doc
合并排序的合并算法一般是异地交换,本文件通过本地交换和异地交换两种方式实现了合并排序,在VC开发环境下验证通过
c++实现的合并排序算法 用递归和非递归两种方式实现的
合并排序算法是一种高效的排序算法,基于“分治”策略,由计算机科学家John W. Hoare在1960年提出。这种算法将一个大问题分解为小问题来解决,然后将小问题的解合并,得到原问题的解。在排序过程中,合并排序将一个...
合并排序是一种高效的、基于分治...整个程序就是这样实现了合并排序算法,其时间复杂度为O(n log n),空间复杂度为O(n)(如果考虑额外的合并空间需求)。这个C++程序展示了如何利用分治法高效地对大规模数据进行排序。
合并排序算法、快速排序算法和递归分治是计算机科学中的基础概念,它们在数据处理和算法设计中占据着重要地位。以下是对这些知识点的详细解释: **合并排序算法(Merge Sort)** 合并排序是一种基于分治策略的排序...
合并排序算法是一种经典的排序算法,由计算机科学家John W. Backus在1959年提出。它的主要思想是采用分治法(Divide and Conquer)将大问题分解为小问题来解决。在这个过程中,我们将一个大的序列拆分为两个或多个小...