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

算法 之 分治 - 合并排序-自顶向下合并排序

阅读更多

这次讲的算法与自底向上算法(ButtomUpSort)很类似,但是实现起来比它更加简单。

在 ButtomUpSort 算法中,我们已经知道了元素是如何由关联排序树的逐层隐含遍历完成排序的。在每一层中,我们有已排序的序列对,然后将它们合并而得到较大的排序序列。沿着树一层一层向上继续这个过程,直到到达根为止,这最后的序列就是已经排序好的。


如果你不了解 BottomUpSort 算法的基本思想,可以参考:算法 之 分治 - 合并排序-自底向上合并排序


现在,让我们从反向来考虑,也就是 自顶向下 取代 自底向上。一开始有输入数组 A = { 9, 4, 5, 2, 1, 7, 4, 6 }

将该数组分成两个4元素的数组 { 9, 4, 5, 2 } 和 { 1, 7, 4, 6}

接着分别对这两个数组的元素排序,然后只是将它们合并来得到所希望的排序数组,这称为 Sort。

至于每一半用的排序方法,可以随意使用任何排序算法来对这两个子数组排序,特别是可以使用算法 Sort 本身。

实际上这就是著名的算法 MergeSort 的思想。


过程  MergeSort

输入  n 个元素的数组 A[1...n]

输出  按非降序排列的数组 A[1...n]


算法描述  mergeSort(A, low, high)

if low < high then

    mid ← (low + high) / 2⌋

    mergeSort(A, low, middle)

    mergeSort(A, middle + 1, high)

    Merge(A, low, middle, high)

end if


算法中用到的 Merge 方法,可以参考:算法 之 分治 - 合并排序-合并两个已排序的表


以下图示显示了对数组 A 的操作过程,

与 BottomUpSort 算法一样,MergeSort 算法所执行的元素比较总次数在 (n log n)/2 和 n log n - n + 1之间。


以下是此算法的一种 Java 实现:

public static void mergeSort(int[] array, int low, int high)
{
	if (low >= high)
		return;

	int middle = (low + high) / 2;
	mergeSort(array, low, middle);
	mergeSort(array, middle + 1, high);

	merge(array, low, middle, high);
}
0
0
分享到:
评论

相关推荐

    java 排序算法 选择排序,插入排序,自顶向上合并排序,合并排序,快速排序

    归并排序是一种采用分治法的排序算法,自顶向下的归并排序则是从大问题开始分解,每次将两个子序列合并成一个有序序列。具体步骤如下: - 将大序列不断拆分成长度为1的子序列。 - 比较相邻的子序列,将它们合并成...

    算法-理论基础- 排序- 归并排序(包含源程序).rar

    在提供的"算法-理论基础- 排序- 归并排序(包含源程序).pdf"文件中,可能会包含以下内容: 1. 归并排序的详细步骤解释,包括伪代码或流程图。 2. 归并排序的源代码实现,可能是C++、Java、Python或其他编程语言。 ...

    根号n段归并排序算法

    根号n段归并排序是一种优化过的归并排序算法,主要针对大数组的排序场景,其核心思想是将数组分成更小的段,每段的大小大约为根号n(向下取整)。这个方法旨在减少合并操作的次数,因为归并排序在合并过程中通常会...

    使用分治法的插入排序

    **插入排序**是一种基础且广泛使用的排序算法,尤其在数据量较小或者部分有序的情况下表现出较高的效率。它基于分治法的思想,将一个大问题分解成若干小问题来解决。在这个场景中,我们讨论的是如何使用分治法的思想...

    算法分析与设计实验报告-分治法.docx

    【分治算法】是计算机科学中一种重要的算法思想,它将一个大问题分解为若干个小问题,分别解决小问题后再合并结果,以达到解决整个大问题的目的。在本实验报告中,分治法具体体现在快速排序算法的实现上。 **快速...

    分治法快速排序算法QuickSort

    总的来说,快速排序是一种非常重要的排序算法,它充分利用了分治法的优势,通过巧妙的分区策略和递归实现,使得在大多数情况下都能获得高效的表现。理解和掌握快速排序对于提升编程能力,特别是在处理数据处理和算法...

    MoreWindows白话经典算法之七大排序

    冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序和堆排序是七大基础的计算机算法,它们各自有着不同的特点和适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要...

    合并排序与快速排序

    合并排序是一种自顶向下的递归算法,其基本思想是将大问题分解为小问题来解决。具体步骤如下: 1. **分解**:将原始数组分为两个相等(或接近相等)的部分。 2. **解决**:对每个子数组进行合并排序,即递归地将...

    排序算法: 冒泡排序,桶排序,计数排序,堆排序,插入排序,合并排序,快速排序,基数排序,选择排序,希尔排序 实现语言: Vue

    6. **合并排序**:合并排序是一种分治策略的排序算法,将大问题分解成小问题解决。它将数组分成两半,对每一半进行排序,然后合并两个有序部分。合并排序的时间复杂度为O(n log n)。 7. **快速排序**:快速排序是C....

    分治法快速排序算法QuickSort C++

    它基于分治法(Divide and Conquer)的思想,是计算机科学中最为广泛使用的排序算法之一。分治法的基本策略是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解...

    java插入排序与合并排序

    **合并排序**,又称为归并排序,是利用分治法的一个典型应用。它将待排序的数组分为两个大小相等(或接近)的部分,对这两部分分别进行排序,然后将结果合并起来。这个过程可以递归进行,直到所有子序列都只有一个...

    合并、快速、插入排序

    - 合并排序(Merge Sort)是一种基于分治策略的排序算法。它将大问题分解为小问题来解决,最后再将小问题的结果合并。 - 基本步骤包括:将数组分为两半,分别对每一半进行排序,然后将两个已排序的子数组合并成一...

    数据结构--快速排序算法的实现

    它的基本思想是分治法(Divide and Conquer),将一个大问题分解为小问题来解决,最终合并小问题的结果得到原问题的解。在数据结构中,快速排序因其平均时间复杂度为O(n log n)而备受青睐,尤其适用于处理大量数据的...

    C语言-算法排序大全

    合并排序是分治策略的应用,将大问题分解为小问题来解决。它将数组分成两半,分别对它们进行排序,然后将两个已排序的子数组合并成一个大的有序数组。 4. **冒泡排序**: 冒泡排序是最基础的排序算法之一,通过...

    8种排序算法(选择排序 冒泡排序 快速排序等~)

    在计算机科学中,排序算法是用于对一组数据进行排列的算法。这里有8种常见的排序算法,包括选择排序、冒泡排序和快速排序等。这些算法各有特点,适用于不同的场景,理解并掌握它们对于编程和数据处理至关重要。 1. ...

    基于python的排序算法-快速排序Quick Sort

    快速排序是一种高效的、分治策略的排序算法,由C.A.R. Hoare在1960年提出。在Python中实现快速排序,我们通常利用递归来分解问题,然后合并结果。快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,...

    数据结构-各种排序算法的源码_C-C++_WINDOWS编程_

    归并排序是一种分治策略的排序算法。它将大问题分解成小问题来解决,然后将小问题的解合并成大问题的解。归并排序将待排序序列分为两半,分别对两半进行排序,然后将两个已排序的子序列合并。由于涉及到递归和额外...

    五种排序算法

    归并排序同样采用了分治策略,它将待排序的数组分成两半,对每一部分递归地应用归并排序,然后将排序好的两部分合并成一个有序的数组。归并排序的时间复杂度为O(n log n),空间复杂度为O(n)。由于归并排序在归并过程...

    常用排序算法总结

    归并排序是一种分治算法,其思想是将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 **特点与应用:** - **时间复杂度:** O...

    排序算法-C语言

    冒泡排序是最简单的排序算法之一,通过不断交换相邻的逆序元素来逐步将序列调整为有序。这个过程就像水底下的气泡一样逐渐上升到水面,因此得名。冒泡排序的时间复杂度在最坏的情况下是O(n²),在最好的情况下(已...

Global site tag (gtag.js) - Google Analytics