`
flforever1213
  • 浏览: 124771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法 之 分治 - 合并排序-合并两个已排序的表

阅读更多

假定有一个数组 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);
}
 
0
0
分享到:
评论

相关推荐

    合并排序(分治策略)报告.doc

    核心函数 `merge` 负责合并两个已排序的子数组,`mergePass` 进行分治步骤,将数组不断拆分并排序,`copy` 函数用于数组复制,而 `print` 函数用于输出排序结果。整个流程通过递归调用这些函数,实现了从局部到整体...

    分治法合并排序算法实现merge

    这一步是合并排序的核心,它涉及两个已排序的序列的合并。从两个子数组的头部开始,比较两个头部元素,选择较小的放入结果数组,并移动相应的指针。重复此过程,直到一个子数组为空,然后将另一个子数组的所有剩余...

    排序算法-合并排序

    合并排序是一种高效的、基于分治思想的排序算法。在计算机科学中,排序是将一系列元素按照特定顺序排列的过程。合并排序由美国计算机科学家John von Neumann于1945年提出,它通过将数据序列分为小段,然后逐步合并...

    分治算法合并排序.docx

    分治算法合并排序 本文介绍了分治算法合并排序的实现细节和实验报告。该实验旨在掌握分治法实现合并排序算法的问题描述、算法设计思想、程序设计和时间复杂度优化。 算法分析 分治算法是一种常用的算法设计思想,...

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    合并排序是基于分治策略的排序算法,它将数据分成两半,分别排序,然后合并两个已排序的子序列。由于采用了递归,其时间复杂度为O(n log n)。在处理大规模数据时,合并排序具有良好的性能。 **5. 快速排序(Quick ...

    分治算法合并排序.pdf

    分治算法合并排序 分治算法是指将一个复杂的问题分解成多个小问题,然后对每个小问题进行解决,最后将结果合并以解决原始问题。合并排序是一种常用的排序算法,它使用分治思想将数组分成小的子数组,然后对每个子...

    分治合并排序代码

    分治合并排序是一种基于分治策略的高效排序算法。分治法是计算机科学中解决问题的一种通用方法,它将一个大问题分解成若干个规模较小、相互独立、与原问题形式相同的子问题,然后分别解决子问题,最后将子问题的解...

    分治法-归并排序

    - 最后,使用`merge()`函数合并两个有序子序列。`merge()`函数接收原始数组、辅助数组、左边界、中间点和右边界作为参数,通过比较两个子序列的元素并将较小的元素放入辅助数组,直到其中一个子序列为空,然后将另一...

    计算机算法与分析合并算法排序即属于分治方法。合并(Merge)就是将两个或多个有序表合并成一个有序表,例如下图所示的两个有序表经合并运算后得到一个有序表。我们在此只用到两个

    合并算法排序即属于分治方法。合并(Merge)就是将两个或多个有序表合并成一个有序表,例如下图所示的两个有序表经合并运算后得到一个有序表。我们在此只用到两个有序表的合并,称为二路并〔Two-way merge)。

    分治策略 合并排序 快速排序 代码 C语言

    3. **合并**:使用两个指针,依次比较并合并两个已排序的子序列,形成最终的有序序列。 **三、快速排序(Quick Sort)** 快速排序也是一种采用分治策略的排序算法。其核心是选择一个“基准”元素,将数组分为两...

    C经典算法之合并排序法

    根据给定的文件信息,我们可以总结出以下关于“C经典算法之合并排序法”的相关知识点: ### 一、概述 本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种...

    分治策略---归并排序

    3. **合并**: 当两个子数组已经排序完毕后,再将它们合并成一个有序的数组。 #### 三、归并排序的具体实现 1. **分解**: 给定一个数组,将其分为两个子数组。 2. **递归排序**: 对这两个子数组分别进行归并排序。 ...

    合并排序算法,快速排序算法,递归,分治

    合并排序算法、快速排序算法和递归分治是计算机科学中的基础概念,它们在数据处理和算法设计中占据着重要地位。以下是对这些知识点的详细解释: **合并排序算法(Merge Sort)** 合并排序是一种基于分治策略的排序...

    分治算法的典型应用——合并排序

    // 合并两个已排序的子数组 } } ``` 这个函数是整个合并排序的核心,它通过递归调用自身来对左右子数组进行排序,并最终通过调用`merge`函数来合并子数组。 #### 四、完整示例 最后给出完整的示例代码,包括...

    C语言版的排序方法---合并排序.docx

    合并排序是一种基于分治策略的高效排序算法,其基本思想是将大问题分解为小问题来解决,最终再将小问题的结果合并成大问题的解。在这个C语言实现的合并排序中,主要涉及两个关键部分:一是如何将数组拆分为更小的...

    合并排序算法C语言源程序.zip

    合并排序是一种高效的、基于分治思想的排序算法。在C语言中实现合并排序,我们可以深入理解这个算法的原理,以及如何用C语言来编写代码。本文将详细探讨合并排序算法的理论基础,C语言实现的关键步骤,以及如何验证...

    VC++多线程实现三种排序算法比较----冒泡排序、快速排序、归并排序

    首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。尽管冒泡...

    采用递归分治的合并排序算法

    采用递归分治方法进行合并排序的算法下载 这是为上机做准备时写的

    数据结构中基于分治策略的排序算法探讨

    本文将重点探讨在**数据结构**中,如何运用**分治策略**来设计高效的排序算法——**合并排序**和**快速排序**。这两种算法都是基于分治思想的经典案例,在实际应用中表现出了优异的性能。 #### 二、分治策略概述 *...

    第2章 分治策略2合并排序(MIT课件)

    合并排序是一种基于分治策略的高效排序算法,其基本思想是将大问题分解为小问题,然后逐个解决这些小问题,最后将解决方案合并,得到原问题的解答。在本章中,我们主要讨论了如何利用合并排序算法来对一个包含n个...

Global site tag (gtag.js) - Google Analytics