1.分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
2.归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
MergerSorter.java
/**
* 归并操作的实现类
*/
public class MergerSorter {
private static final int[] ARRAY = {2, 5, 10, 30, 60, 40, 5, 6, 66};
public int[] sort(int[] array) {
if (array.length == 1)
return array;
final int dividePos = array.length / 2;
int[] array1 = new int[dividePos];
System.arraycopy(array, 0, array1, 0, array1.length);
int[] array2 = new int[array.length - dividePos];
System.arraycopy(array, dividePos, array2, 0, array2.length);
return merge(sort(array1), sort(array2));
}
public int[] merge(int[] a1, int[] a2) {
int[] result = new int[a1.length + a2.length];
int cursor = 0;
int cursor1 = 0;
int cursor2 = 0;
while (cursor1 < a1.length && cursor2 < a2.length) {
if (a1[cursor1] > a2[cursor2]) {
result[cursor++] = a2[cursor2++];
} else {
result[cursor++] = a1[cursor1++];
}
}
while (cursor1 < a1.length) {
result[cursor++] = a1[cursor1++];
}
while (cursor2 < a2.length) {
result[cursor++] = a2[cursor2++];
}
return result;
}
public static void main(String args[]) {
int[] r = new MergerSorter().sort(ARRAY);
for (int t : r) {
System.out.print(t + ",");
}
}
}
MergerSorterTest.java
import static org.junit.Assert.assertArrayEquals;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* TestCase of MergerSorter
*/
public class MergerSorterTest {
private MergerSorter mergerSorter = null;
@Before
public void setUp() throws Exception {
mergerSorter = new MergerSorter();
}
@After
public void tearDown() throws Exception {
mergerSorter = null;
}
@Test
public void merge() {
int[] a1 = {2, 6, 8, 9};
int[] a2 = {5, 8, 10, 12};
int[] expected = {2, 5, 6, 8, 8, 9, 10, 12};
assertArrayEquals(expected, mergerSorter.merge(a1, a2));
}
@Test
public void sort() {
int[] srcArray = {9, 12, 6, 10, 8, 2, 8, 5};
int[] expected = {2, 5, 6, 8, 8, 9, 10, 12};
assertArrayEquals(expected, mergerSorter.sort(srcArray));
}
}
分享到:
相关推荐
归并排序(Merge Sort)是一种常用的排序算法,属于分治算法的范畴。下面将详细介绍归并排序算法的java实现。 什么是归并排序? 归并排序是一种基于分治策略的排序算法。其基本思想是将一个大的无序数组分成两个或...
根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...
这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...
在本篇《Java数据结构和算法》学习笔记中,我们将深入探讨递归和归并排序。递归是一种强大的编程技术,常用于解决复杂问题,而归并排序则是利用递归实现的一种高效排序算法。 首先,让我们理解什么是递归。递归是...
例如,快速排序、归并排序、大整数乘法、最近点对查找等问题都可以用分治算法来解决。它能够简化问题的复杂性,提高算法的效率,尤其是在数据量大的情况下。 4. 注意事项 - 分治算法的效率取决于问题的分解方式...
标题 "各种排序算法java实现" 涉及到的是计算机科学中的一个重要领域——算法,特别是排序算法在Java编程语言中的具体应用。排序算法是数据结构与算法分析中的基础部分,它们用于将一组数据按照特定顺序排列。在这个...
Hoare提出的快速排序是一种分治算法,通过选取一个“基准”元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分所有元素都大于基准,然后递归地对这两部分进行排序。平均时间复杂度为O(n log n),但在最...
本资料集是“数据结构与算法答案——java语言描述”,虽然全为英文内容,但其深入探讨了使用Java实现数据结构和算法的细节。 1. **数组**:数组是最基本的数据结构之一,它是一系列相同类型元素的集合,可以通过索...
本文将深入探讨标题和描述中提及的五种经典排序算法——插入排序、归并排序、选择排序、冒泡排序和希尔排序,以及它们在Java中的实现。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观的排序算法,它的工作...
在提供的博客链接中,作者可能详细解释了这些内部排序算法的Java实现,并可能探讨了它们的性能分析、优化技巧以及适用场景。通过阅读这篇博客,读者可以深入理解内部排序算法的核心思想,提升自己的编程技能和算法...
通过Java实现数据结构和算法,可以更好地理解面向对象编程的思想,并利用其优势提高代码的可读性和可维护性。 此外,书中可能还包含了实际编程中的技巧和陷阱,如内存管理、异常处理和并发编程等。了解这些不仅能...
首先,我们来看看基础的排序算法——冒泡排序。冒泡排序是最简单的交换排序,通过重复遍历待排序的数列,依次比较相邻元素并根据需要交换它们的位置,直到没有任何一对数字需要交换为止。虽然效率较低,但它对于理解...
以下将详细讲解标题“各种排序Java代码”中涉及的几种排序方法,包括快速排序、冒泡排序、堆排序和归并排序。 1. **快速排序(Quick Sort)**: 快速排序是一种基于分治思想的高效排序算法,由C.A.R. Hoare在1960...
Java 提供了一个内置的排序方法 `Arrays.sort()`,它使用了TimSort算法,一种混合排序算法,结合了插入排序和归并排序的优点,对小规模数据和已部分排序的数据有很好的表现。在Java 8中,`Arrays.sort()`对于基本...
7. **分治法**:将大问题分解为小问题解决,然后将结果合并,如归并排序、快速排序等算法都采用了这种策略。 8. **数据结构**:如链表、栈、队列、树、图、哈希表等,它们是算法的基石,理解和熟练使用这些数据结构...
归并排序,利用了分治法,将大问题分解为小问题解决;堆排序,通过构建最大(或最小)堆来实现排序等。这些算法各有优缺点,适用于不同的场景,理解并熟练运用它们能极大地提高编程效率和解决问题的能力。 在实际...
归并排序是一种分治策略,其基本思想是将大问题分解为小问题来解决。具体步骤如下: 1. **分割**:将原始序列分成两个相等或近似的子序列。 2. **递归排序**:对每个子序列独立进行归并排序。 3. **合并**:将两个...