算法描述: 对n个元素进行排序
算法思想: 将待排序元素分成大小大致相同的2个子集合,分别对2个集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合.
实现程序:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All right reserved.
*
* Created on 2011
*
* http://jarg.iteye.com/
*
*/
// Authors: Jarg Yee <yeshaoting@gmail.com>
/**
* 合并排序,以小到大排序
*/
public class MergeSort
{
/** 待排序的数组 */
private static int[] value = {2,1,4,3,6,5,8,7,9,0};
/** for debugging. */
public static void main(String[] args)
{
mergeSort(0,value.length-1);
display();
}
/** 合并排序 */
private static void mergeSort(int beginIndex,int endIndex)
{
if(beginIndex<endIndex)
{
int mid = (endIndex+beginIndex)/2; // 分割中点
mergeSort(beginIndex,mid); // 分割后左段
mergeSort(mid+1,endIndex); // 分割后右段
merge(beginIndex,endIndex); // 合并数组
}
// beginIndex==endIndex的情况不用处理
}
/** 合并段 */
private static void merge(int beginIndex,int endIndex)
{
/* 临时保存排好序的数组 */
int[] temp = new int[endIndex-beginIndex+1];
/* 段分界点 */
int mid = (beginIndex + endIndex)/2;
int i=beginIndex, j=mid+1, k=0;
while(i<=mid&&j<=endIndex)
{
/* 比较元素大小,按大小依次放入temp中 */
if(value[i]>=value[j])
{
temp[k++] = value[j++]; // 第二段元素加入temp
}
else
{
temp[k++] = value[i++]; // 第一段元素加入temp
}
}
/* 第一段数组索引i大于段最大标号 */
if(i>mid)
{
/* 把第二段未放入temp中的元素依次放入temp */
for(int t=j;t<=endIndex;t++)
{
temp[k++] = value[t];
}
}
else
{
/* 把第一段未放入temp中的元素依次放入temp */
for(int t=i;t<=mid;t++)
{
temp[k++] = value[t];
}
}
/* 把临时保存的已经排好序的数组值覆盖原始值 */
for(int t=0;t<temp.length;t++)
{
value[beginIndex+t] = temp[t];
}
//System.out.println("beginIndex:" + beginIndex + "\tendIndex:" + endIndex);
}
/** 显示排序后的结果 */
private static void display()
{
for(int i=0;i<value.length;i++)
System.out.println("value[" + i + "]=" + value[i]);
}
}
- 大小: 9.3 KB
分享到:
相关推荐
归并排序同样采用分治策略,将数组分为两半,分别排序后合并。它的特点是稳定性好,但需要额外的空间来存储临时数组。 总的来说,递归函数在C语言中的应用丰富多样,递归排序法是其中的经典示例。掌握递归的思想和...
二叉树的构建过程可以用来模拟归并排序的递归求解步骤。在二叉树中,每个节点代表一个子数组,而节点的左子树和右子树则代表了被划分的左右子数组。通过递归地在二叉树中下降,可以模拟出归并排序的递归调用过程。...
合并排序算法、快速排序算法和递归分治是计算机科学中的基础概念,它们在数据处理和算法设计中占据着重要地位。以下是对这些知识点的详细解释: **合并排序算法(Merge Sort)** 合并排序是一种基于分治策略的排序...
2. **征服阶段(Conquer)**:对每个子数组递归地应用合并排序。这意味着我们将继续分割每个子数组,直到它们只包含一个元素,这是排序的基本单位。 3. **合并阶段(Combine)**:将已排序的子数组合并回一个有序...
2. **解决**:递归地对每个半序列进行合并排序。 3. **合并**:使用两个指针,依次比较并合并两个已排序的子序列,形成最终的有序序列。 **三、快速排序(Quick Sort)** 快速排序也是一种采用分治策略的排序算法...
- **分治**:将一个复杂问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 - **动态规划**:主要用于优化问题,通过将问题分解成相互重叠的子问题,并...
归并排序则是利用递归将数组拆分成两个半部分,分别排序后再合并,保持排序顺序。 蛮力(Brute Force)求解是一种简单直接的方法,不考虑任何优化,通常用于解决复杂度较高的问题。在排序领域,最直观的蛮力排序...
- **分治算法**:如快速排序、归并排序等,将大问题划分为小问题,然后合并结果。 尽管递归有其优雅和简洁的一面,但也需要注意几个问题: 1. **效率**:递归可能会导致大量的函数调用,增加内存开销,特别是在...
### 全排列——递归排序和字典序列 在计算机科学与编程领域中,全排列是一种重要的算法,它被广泛应用于解决多种问题,如组合优化、密码学等。本文将详细介绍两种实现全排列的方法:递归排列和字典序排列,并通过...
递归通常涉及到分治策略,即将问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 在"简单插入排序 递归法——C语言代码"这个项目中,我们将看到如何使用...
在编程中,递归通常与分治策略相结合,将大问题分解为小问题,直到小问题足够简单可以直接求解,然后将这些小问题的解组合成原问题的解。递归的关键在于必须有一个明确的基线条件(base case),即问题可以不经过...
在数组排序中,递归可以用来将一个包含子数组的复杂数组分解为多个单一数组,然后对这些子数组进行排序,最后再根据需要合并排序结果。 在给定的示例中,定义了一个名为recursion_orderby的函数,这个函数使用了...
- **快速排序**:通过选取一个“基准”元素,将数组分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于或等于基准的元素,然后对这两个子数组递归执行快速排序。 - **归并排序**:将数组分成两半,...
- **合并排序**:对靠近中间线的点进行合并排序,以便快速查找可能的最近点对。 - **分组处理**:通过分组的方式对点进行处理,减少不必要的比较操作。 ### 五、总结 递归是一种强大的编程技术,在很多算法设计...
合并排序的实现中,`MergeSort()`函数递归地将数组分割为两半,然后调用`MergeLists()`函数将已排序的子数组合并。 - **快速排序(Quick Sort)**:快速排序的分解过程是选择一个“基准”元素,然后重新排列数组,...
**合并排序与快速排序** 归并排序是分治法的典型应用,它通过比较将两个已排序的子数组合并为一个有序数组。其主要缺点是需要额外的线性空间。 快速排序则是另一种高效的分治排序算法,它通过选取一个“基准”元素...
每次拆分时,我们都在递归地解决问题,直到子数组只剩一个元素(这是基础情况),然后逐步合并这些已排序的子数组,最终得到整个数组的排序版本。 二分查找是一种在有序数组中查找特定元素的搜索算法。它通过不断...
递归方程则描述了如何将大问题分解为小问题并利用递归调用来求解。 **阶乘函数** 是递归的一个经典例子。递归定义为: - 如果 `n = 0` 或 `n = 1`,那么 `n! = 1`(这是边界条件)。 - 对于其他 `n`,`n! = n * (n ...
分治法是一种处理复杂问题的有效方法,它将大问题分解为相互独立或相似的子问题,然后对子问题进行求解,最后合并子问题的解得到原问题的解。典型的分治算法有快速排序、归并排序和大整数乘法等。 以快速排序为例,...