假定有一个数组 A[1...n],low, middle, high 为它的三个索引,并有 1 ≤ low ≤ middle < high ≤ n,使得两个子数组 A[low...middle],A[middle+1...high] 各自按升序排列。
我们要重新排列A中元素的位置,使得 A[low...high] 中的元素也按升序排列。这就是合并 A[low...middle] 和 A[middle+1...high] 的过程。
举个例子,就是我们有个数组 A = { 0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9 }; 这里 low=0, middle=5, high=10
我们要对它进行排序使 A = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
我们可以使用这样的方法来合并这两个子数组:
首先使用两个索引 s 和 t,初始化时各自指向 A[low] 和 A[middle+1],再用一个空数组 B[low...high] 做暂存器。每一次比较元素 A[s] 和 A[t],将小的元素添加到辅助数组 B,如果相同就把 A[s] 添加进去。
然后更新索引,如果 A[s] ≤ A[t],则 s 加 1,否则 t 加 1,当条件 s=middle+1 或 t=high+1 成立时过程结束。
s=middle+1 时,我们把数组 A[t...high] 中剩余的元素添加到 B,
t=high+1 时,把数组 A[s...middle] 中剩余的元素添加到 B。
最后,把数组 B[low...high] 复制回 A[low...high]。
过程 Merge
输入 数组 A[1...n] 和它的三个索引 low, middle, high, 1 ≤ low ≤ middle < high ≤ n,
两个子数组 A[low...middle] 和 A[middle+1...high] 各自按升序排列
输出 合并两个子数组 A[low...middle] 和 A[middle+1...high] 的数组 A[low...high]
算法描述
comment: B[low...high] 是个辅助数组
s ← low; t ← middle+1; index ← low
while s ≤ middle and t ≤ high
if A[s] ≤ A[t] then
B[k] ← A[s]
s ← s + 1
else
B[k] ← A[t]
t ← t + 1
end if
index ← index + 1
end while
if s = middle+1 then B[k...high] ← A[t...high]
else B[k...high] ← A[s...middle]
end if
A[low...high] ← B[low...high]
以下是此算法的 Java 实现:
private static void merge(int[] array, int low, int middle, int high)
{
int length = high - low + 1;
int indexLowToMiddle = low; // 从 low 位置开始的索引
int indexMiddleToHigh = middle + 1; // 从 middle+1 位置开始的索引
int[] tempArray = new int[length];
int tempIndex = 0;
while (indexLowToMiddle <= middle && indexMiddleToHigh <= high)
{
if (array[indexLowToMiddle] <= array[indexMiddleToHigh])
{
tempArray[tempIndex] = array[indexLowToMiddle];
indexLowToMiddle += 1;
}
else
{
tempArray[tempIndex] = array[indexMiddleToHigh];
indexMiddleToHigh += 1;
}
tempIndex += 1;
}
if (indexLowToMiddle == middle + 1)
{
System.arraycopy(
array, indexMiddleToHigh, tempArray, tempIndex, length - tempIndex);
}
else
{
System.arraycopy(
array, indexLowToMiddle, tempArray, tempIndex, length - tempIndex);
}
System.arraycopy(tempArray, 0, array, low, length);
}
分享到:
相关推荐
核心函数 `merge` 负责合并两个已排序的子数组,`mergePass` 进行分治步骤,将数组不断拆分并排序,`copy` 函数用于数组复制,而 `print` 函数用于输出排序结果。整个流程通过递归调用这些函数,实现了从局部到整体...
这一步是合并排序的核心,它涉及两个已排序的序列的合并。从两个子数组的头部开始,比较两个头部元素,选择较小的放入结果数组,并移动相应的指针。重复此过程,直到一个子数组为空,然后将另一个子数组的所有剩余...
合并排序是一种高效的、基于分治思想的排序算法。在计算机科学中,排序是将一系列元素按照特定顺序排列的过程。合并排序由美国计算机科学家John von Neumann于1945年提出,它通过将数据序列分为小段,然后逐步合并...
分治算法合并排序 本文介绍了分治算法合并排序的实现细节和实验报告。该实验旨在掌握分治法实现合并排序算法的问题描述、算法设计思想、程序设计和时间复杂度优化。 算法分析 分治算法是一种常用的算法设计思想,...
合并排序是基于分治策略的排序算法,它将数据分成两半,分别排序,然后合并两个已排序的子序列。由于采用了递归,其时间复杂度为O(n log n)。在处理大规模数据时,合并排序具有良好的性能。 **5. 快速排序(Quick ...
分治算法合并排序 分治算法是指将一个复杂的问题分解成多个小问题,然后对每个小问题进行解决,最后将结果合并以解决原始问题。合并排序是一种常用的排序算法,它使用分治思想将数组分成小的子数组,然后对每个子...
分治合并排序是一种基于分治策略的高效排序算法。分治法是计算机科学中解决问题的一种通用方法,它将一个大问题分解成若干个规模较小、相互独立、与原问题形式相同的子问题,然后分别解决子问题,最后将子问题的解...
- 最后,使用`merge()`函数合并两个有序子序列。`merge()`函数接收原始数组、辅助数组、左边界、中间点和右边界作为参数,通过比较两个子序列的元素并将较小的元素放入辅助数组,直到其中一个子序列为空,然后将另一...
合并算法排序即属于分治方法。合并(Merge)就是将两个或多个有序表合并成一个有序表,例如下图所示的两个有序表经合并运算后得到一个有序表。我们在此只用到两个有序表的合并,称为二路并〔Two-way merge)。
3. **合并**:使用两个指针,依次比较并合并两个已排序的子序列,形成最终的有序序列。 **三、快速排序(Quick Sort)** 快速排序也是一种采用分治策略的排序算法。其核心是选择一个“基准”元素,将数组分为两...
根据给定的文件信息,我们可以总结出以下关于“C经典算法之合并排序法”的相关知识点: ### 一、概述 本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种...
3. **合并**: 当两个子数组已经排序完毕后,再将它们合并成一个有序的数组。 #### 三、归并排序的具体实现 1. **分解**: 给定一个数组,将其分为两个子数组。 2. **递归排序**: 对这两个子数组分别进行归并排序。 ...
合并排序算法、快速排序算法和递归分治是计算机科学中的基础概念,它们在数据处理和算法设计中占据着重要地位。以下是对这些知识点的详细解释: **合并排序算法(Merge Sort)** 合并排序是一种基于分治策略的排序...
// 合并两个已排序的子数组 } } ``` 这个函数是整个合并排序的核心,它通过递归调用自身来对左右子数组进行排序,并最终通过调用`merge`函数来合并子数组。 #### 四、完整示例 最后给出完整的示例代码,包括...
合并排序是一种基于分治策略的高效排序算法,其基本思想是将大问题分解为小问题来解决,最终再将小问题的结果合并成大问题的解。在这个C语言实现的合并排序中,主要涉及两个关键部分:一是如何将数组拆分为更小的...
合并排序是一种高效的、基于分治思想的排序算法。在C语言中实现合并排序,我们可以深入理解这个算法的原理,以及如何用C语言来编写代码。本文将详细探讨合并排序算法的理论基础,C语言实现的关键步骤,以及如何验证...
首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。尽管冒泡...
采用递归分治方法进行合并排序的算法下载 这是为上机做准备时写的
本文将重点探讨在**数据结构**中,如何运用**分治策略**来设计高效的排序算法——**合并排序**和**快速排序**。这两种算法都是基于分治思想的经典案例,在实际应用中表现出了优异的性能。 #### 二、分治策略概述 *...
合并排序是一种基于分治策略的高效排序算法,其基本思想是将大问题分解为小问题,然后逐个解决这些小问题,最后将解决方案合并,得到原问题的解答。在本章中,我们主要讨论了如何利用合并排序算法来对一个包含n个...